execl函数 && vfork()

execl函数 && vfork()

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

你可能感兴趣的:(execl函数 && vfork())