exec函数族和守护进程

​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);
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值