//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!