//execl函数 && vfork()
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
main()
{
int pid;
if((pid=vfork()) == 0) {
//(0)
execl("/bin/ls", "ls", "-al", "/etc/passwd", (
char *)0);
//(1)
//char * argv[] = {"ls", "-al", "/etc/passwd", 0};
//execvp("ls", argv); //(2)
}
else if(pid > 0) {
printf("I'm a parent!\n");
}
}
---------------------------------------------------
(0) vfork()和execl()配套使用可以提高效率(必须配套使用)
(1)
int execvp(
const char *file,
char *
const argv[]);
函数execvp()应该先构造一个指向各参数的指针数组,然后将该数组地址作为参数
(2)
int execl(
const char *path,
const char *arg,
);
函数execl()要求将新程序的每个命令行参数都说明成一个单独的参数,这种参数表以空指针结尾
(3)vfork创建的子进程后,父进程会被阻塞,直到子进程执行execl和exit
(4)当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行。因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
(5)当前进程的正文都被替换了,那么execl后的语句,即便execl退出了,都不会被执行。
(6)execl成功则不返回值, 失败返回-1, 失败原因存于errno中
$ ./a.
out -rw-r--r-- 1 root root 1448 2007-05-16 17:30 /etc/passwd
I'm a parent!