本文共 1450 字,大约阅读时间需要 4 分钟。
传智扫地僧课程学习笔记。
vfork有个限制,子进程必须立刻执行_exit或者exec函数,否则程序就会挂掉,
fork子进程拷贝父进程的数据段
Vfork子进程与父进程共享数据段;
Vfork和exec函数族在一起
execve替换进程映像(加载程序)注意execve是一个系统调用;
替换意味着:代码段、数据段、堆栈段、进程控制块PCB全部替换,#include#include #include #include #include #include #include #include /*{ "aaaa", "bbbb" null 0 \0 }*/int main01(void ){ pid_t pid; int ret = 0; printf("befor fork pid:%d \n", getpid()); int abc = 10; pid = vfork(); //errno if (pid == -1) { //printf("pid < 0 err.\n"); perror("tile"); return -1; } if (pid > 0) { printf("parent: pid:%d \n", getpid()); } else if (pid == 0) { printf("child: %d, parent: %d \n", getpid(), getppid()); //printf("abc:%d\n", abc); //把自己写应用程序启动起来 // ret = execve("./hello", NULL, NULL); if (ret == -1) { perror("execve:"); } printf("execve 测试有没有执行\n"); exit(0); } printf("fork after....\n"); return 0;}int main(void ){ pid_t pid; int ret = 0; printf("befor fork pid:%d \n", getpid()); int abc = 10; pid = vfork(); //errno if (pid == -1) { //printf("pid < 0 err.\n"); perror("tile"); return -1; } if (pid > 0) { printf("parent: pid:%d \n", getpid()); } else if (pid == 0) { printf("child: %d, parent: %d \n", getpid(), getppid()); //printf("abc:%d\n", abc); //把自己写应用程序启动起来 //通过一个应用程序执行命令 char *const argv[] = {"ls", "-l", NULL}; ret = execve("/bin/ls", argv, NULL); if (ret == -1) { perror("execve:"); } printf("execve 测试有没有执行\n"); exit(0); } //printf("fork after....\n"); return 0;}
转载地址:http://eobcn.baihongyu.com/