进程、线程和进程间通信——exec函数族和守护进程

进程、线程和进程间通信——exec函数族和守护进程——如何实现让父子进程执行不同的程序 ?
摘要由CSDN通过智能技术生成

目录

一、exec函数族

1.execl / execlp

2. execv / execvp

 3.system(非exec函数族)

二、守护进程(Daemon Process)

1.基础内容

2.守护进程创建

(1)创建子进程,父进程退出

(2)子进程创建新会话

(3)更改当前工作目录(非必要)

(4)重设文件权限掩码(非必要)

(5)关闭打开的文件描述符(stdin / stdout / stderr)

3.更简便地创建守护进程


一、exec函数族

背景:fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码

如何实现让父子进程执行不同的程序 ?

  1. (1)父进程创建子进程  
  2. (2)子进程调用exec函数族  
  3. (3)父进程不受影响

重要特点:进程调用exec函数族执行某个程序 ,进程当前内容被指定的程序替换

作用:执行指定的程序

1.execl / execlp

#include  <unistd.h>  

int execl(const char *path, const char *arg, …);  

#include  <unistd.h>  

int execlp(const char *file, const char *arg, …);

要点:

  • 成功时执行指定的程序;失败时返回EOF
  • path   执行的程序名称,包含路径  
  • arg…  传递给执行的程序的参数列表  
  • file   执行的程序的名称,在PATH中查找

注意:

两个函数区别execlp不需要写文件名全路径,在PATH查找

最后一个参数必须用空指针(NULL)作结束

进程当前内容被指定的程序替换,但进程号不变(PID)

第0个参数必须要写,虽然它没有使用

示例代码:执行ls命令,显示/etc目录下所有文件的详细信息,相当于直接在终端输入"ls -a -l"指令

#include <stdio.h>
#include <unistd.h>

int main()
{
   //使用execl函数
   if(execl("/bin/ls","ls","-a","-l","./",NULL) < 0)
   {
	    perror("execl");
   }
/*
   //使用execlp函数
   if(execlp("ls","ls","-a","-l","./",NULL) < 0)
   {
	    perror("execlp");
   }
*/

}

执行结果:执行程序的结果与在终端输入"ls -a -l"指令结果相同

示例代码:验证:进程当前内容被指定的程序替换

#include <stdio.h>
#include <unistd.h>

int main()
{
   printf("hello\n");//打印hello
   if(execlp("ls","ls","-a","-l","./",NULL) < 0)
   {
	    perror("execl");
   }
   printf("world\n");//不打印world
   return 0;
}

 执行结果:只执行exec函数前面的打印内容,exec函数后面的打印不执行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值