天下

记录修行的印记

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!

posted on 2012-07-05 09:41 天下 阅读(1224) 评论(0)  编辑 收藏 引用 所属分类: Linux编程


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(4)

随笔分类(378)

随笔档案(329)

链接

最新随笔

搜索

最新评论