//execl函數(shù) && 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[]);
函數(shù)execvp()應(yīng)該先構(gòu)造一個(gè)指向各參數(shù)的指針數(shù)組,然后將該數(shù)組地址作為參數(shù)
(2)
int execl(
const char *path,
const char *arg,

);
函數(shù)execl()要求將新程序的每個(gè)命令行參數(shù)都說明成一個(gè)單獨(dú)的參數(shù),這種參數(shù)表以空指針結(jié)尾
(3)vfork創(chuàng)建的子進(jìn)程后,父進(jìn)程會(huì)被阻塞,直到子進(jìn)程執(zhí)行execl和exit
(4)當(dāng)進(jìn)程調(diào)用一種exec函數(shù)時(shí),該進(jìn)程完全由新程序代換,而新程序則從其main函數(shù)開始執(zhí)行。因?yàn)檎{(diào)用exec并不創(chuàng)建新進(jìn)程,所以前后的進(jìn)程ID并未改變。exec只是用另一個(gè)新程序替換了當(dāng)前進(jìn)程的正文、數(shù)據(jù)、堆和棧段。
(5)當(dāng)前進(jìn)程的正文都被替換了,那么execl后的語句,即便execl退出了,都不會(huì)被執(zhí)行。
(6)execl成功則不返回值, 失敗返回-1, 失敗原因存于errno中
$ ./a.
out -rw-r--r-- 1 root root 1448 2007-05-16 17:30 /etc/passwd
I'm a parent!