有时我们需要在子进程中执行其他程序,即替换当前进程映像,这就需要exec系列,今天试用一下execl函数
原型:
int execl(const char *path, const char *arg, …);
- 第一个参数必须是完整路径且包含文件名,第二个参数为文件名
- excel 调用后,excel之后的代码不会被执行,因为子进程中代码被替换
- excel 函数不会关闭原进程打开的文件描述符,除非该文件描述符被设置了SOCK_CLOEXEC
- excel 函数一般不会返回,除非出错,返回-1,并设置errno
编码
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main()
{
int array[]={3,4};
pid_t child_p;
child_p = fork();
if ( child_p > 0 )
{
int t = 0;
for(; t<5; t++)
{
printf("我是parent, %d, %d\n",array[0],array[1]);
array[0] += 2;
array[1] += 2;
sleep(1);
}
}
else if ( child_p == 0 )
{
//第一个参数必须是完整路径且包含文件名,第二个参数为文件名
if ( execl("/home/klft/work/lxj/learn/mulprocess/a.out","a.out",NULL) <0 )
{
perror("execl执行失败,errmsg:");
}
//excel之后的代码都不会被执行,因为子进程代码已经改变
int p = 0;
for(; p<5; p++)
{
printf("我是child, %d, %d\n",array[0],array[1]);
array[0] += 1;
array[1] += 1;
sleep(1);
}
}
return 1;
}
a.out的源码:
#include <stdio.h>
int main()
{
int h = 1;
for (; h<5; h++)
{
printf("我是新程序\n");
}
return 1;
}
执行结果:
我是parent, 3, 4
我是新程序
我是新程序
我是新程序
我是新程序
我是parent, 5, 6
我是parent, 7, 8
我是parent, 9, 10
我是parent, 11, 1
可以发现,execl 语句执行的for循环没有再执行。