exec函数族
进程调用exec函数族执行某个程序
进程当前内容被指定的程序替换
实现让父子进程执行不同的程序
1.父进程创建子进程
2.子进程调用exec函数
3.父进程不受影响
execl/execlp
if(execl("/bin/ls",'ls',"-l","/etc"),NULL)<0{ perror("execl");} 相当于 执行 ls -a -l /etc
if(execlp("ls","ls","-a","-l","/etc",NULL)<0){ perror("execlp"); }
注意:
1.两个函数区别execlp不需要写文件全路径,在PATH查找最后一个参数必须用空指针NULL做结束
2.进程当前内容被指定的程序替换,但进程号不变.
3.第0个参数必须要写,但没有使用.
守护进程:
是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件
守护进程创建
1.创建子进程,父进程退出 if(fork() >0){exit(0);}
子进程变成孤儿进程,被init进程收养
子进程在后台运行
2.子进程创建新会话 if(setsid() < 0 ){ exit(-1);}
子进程成为新的会话组长
子进程脱离原先的终端
3.更改当前工作目录
chdir("/"); chdir("/tmp");守护进程一直在后台运行,其工作目录不能被卸载重新设定当前工作目录cwd
4.守护进程创建
重设文件权限掩码 if(umask(0) <0) { exit(-1);}
文件权限掩码设置为0
只影响当前进程
5.关闭打开的文件描述符
int i; for(i= 0 ;i<3;i++){ close(i);}
关闭所有从父进程继承的打开文件
已脱离终端,stdin/stdout/stderr无法在使用
创建守护进程的代码:
#include <stdio.h>
#include <unistd.h>
int main(){
pid_t pid;
pid = fork(); //1.创建子进程
if(pid <0 )
{
perror("fork");
return 0;
}else if(pid > 0)
{
exit(0);
}
printf(“i am a demon\n”); //2.子进程创建新会话
printf("sid=%d,pid= %d,pgid=%d\n",getsid(getpid()),getpid(),getpgid(getpid()));
if(setsid()<0){
perror("setsid");
exit(0);
}
printf("after sid=%d,pid=%d,pgid=%d\n",getsid(getpid()),getpid(),getpgid(getpid()));
sleep(100);
chdir("/"); //3.更改当前工作目录
if(unmask(0)<0)
{
perror("unmask");
exit(0);
}
close(0);
close(1);
close(2);
sleep(1000);
}