目录
(5)关闭打开的文件描述符(stdin / stdout / stderr)
一、exec函数族
背景:fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码。
如何实现让父子进程执行不同的程序 ?
- (1)父进程创建子进程
- (2)子进程调用exec函数族
- (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函数后面的打印不执行