- 论坛徽章:
- 0
|
fork、exec系列与system、popen区别
原帖由 "蓝色键盘" 发表:
1、fork()
一个进程一旦调用exec类函数,它本身就“死亡”了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留下的,就是进程号,也就是说,对系统而言,还是同一个进程,不过已经是另一个程序了。不过exec类函数中有的还允许继承环境变量之类的信息,这个通过exec系列函数中的一部分函数的参数可以得到。
如键盘兄所述,exec 会代替原先的进程,但是为什么exec之后,仍然可以返回呢?
比如下面的程序,在第一个exec后,程序仍然可以继续运行。无论是出错处理或者是再执行下一个exec,表现都非常棒。
请教一下,是不是在exec时,系统仍然为进程设置了堆栈以保存原来进程的所有信息呢?是由内核实现的吗?与平常的function有什么不同呢?
如果我理解正确的话,我想这个也能算是exec与fork的区别之一:exec时,内核需要保存堆栈.fork时,内核不需要保存堆栈。
如果上面的说法正确的话,那么exec一定比fork要慢。
因为fork时,系统只要拷贝子进程的一次。而exec时,首先要把原来进程入栈,另外还需要把新进程拷贝到原来的进程之中。
当exec返回时,还有一个原来进程出栈的操作,也需要切换到内核态执行。
其三,如果exec的进程比原进程要大的话,还需要重新申请内存。如果比原来进程要小得多的话,是不是也浪费了相当多的内存?
请键盘和无双两位老大多多指教呀。
还有个建议,这个帖子应该加精的。大家好查看的。
- #include <sys/types.h>;
- #include <sys/wait.h>;
- #include "ourhdr.h"
- char *env_init[] = { "USER=unknown", "PATH=/tmp", NULL };
- int
- main(void)
- {
- pid_t pid;
- if ( (pid = fork()) < 0)
- err_sys("fork error");
- else if (pid == 0) { /* specify pathname, specify environment */
- if (execle("/usr/home/mike/study/C/APUE/echoarg",
- "echoarg", "myarg1", "MY ARG2", (char *) 0,
- env_init) < 0)
- err_sys("execle error");
- }
- if (waitpid(pid, NULL, 0) < 0)
- err_sys("wait error");
- if ( (pid = fork()) < 0)
- err_sys("fork error");
- else if (pid == 0) { /* specify filename, inherit environment */
- if (execlp("echoarg",
- "echoarg", "only 1 arg", (char *) 0) < 0)
- err_sys("execlp error");
- }
- exit(0);
- }
复制代码 |
|