免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 蓝色键盘
打印 上一主题 下一主题

fork、exec系列与system、popen区别 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2003-06-26 11:18 |显示全部楼层

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的进程比原进程要大的话,还需要重新申请内存。如果比原来进程要小得多的话,是不是也浪费了相当多的内存?

请键盘和无双两位老大多多指教呀。

还有个建议,这个帖子应该加精的。大家好查看的。

  1. #include        <sys/types.h>;
  2. #include        <sys/wait.h>;
  3. #include        "ourhdr.h"

  4. char    *env_init[] = { "USER=unknown", "PATH=/tmp", NULL };

  5. int
  6. main(void)
  7. {
  8.         pid_t   pid;

  9.         if ( (pid = fork()) < 0)
  10.                 err_sys("fork error");
  11.         else if (pid == 0) {    /* specify pathname, specify environment */
  12.                 if (execle("/usr/home/mike/study/C/APUE/echoarg",
  13.                                    "echoarg", "myarg1", "MY ARG2", (char *) 0,
  14.                                    env_init) < 0)
  15.                         err_sys("execle error");
  16.         }
  17.         if (waitpid(pid, NULL, 0) < 0)
  18.                 err_sys("wait error");

  19.         if ( (pid = fork()) < 0)
  20.                 err_sys("fork error");
  21.         else if (pid == 0) {    /* specify filename, inherit environment */
  22.                 if (execlp("echoarg",
  23.                                    "echoarg", "only 1 arg", (char *) 0) < 0)
  24.                         err_sys("execlp error");
  25.         }
  26.         exit(0);
  27. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2003-06-26 16:09 |显示全部楼层

fork、exec系列与system、popen区别

system是由shell实现的。并不是ansi标准函数。所以需要调shell来实现。应该是这样吧
所以不同系统应该不一样呀,如果提供了专门的C函数接口,应该是fork 后exec。

不知道这样说对不对呀

论坛徽章:
0
3 [报告]
发表于 2003-06-27 09:12 |显示全部楼层

fork、exec系列与system、popen区别

请问无双版主,我在上面所说的关于fork和exec的区别对吗?主要是入栈出栈那块。

论坛徽章:
0
4 [报告]
发表于 2003-06-27 12:57 |显示全部楼层

fork、exec系列与system、popen区别

请教无双:

    既然数据段和代码段都被新进程映象直接替换,而且内核或exec都没有复制旧进程信息,那么 exec执行完后,为什么原来的进程还存在,并且可以继续执行代码呢?
    进程描述表中的文件描述符和旧进程内其它信息没有关闭,这句话的意思是不是说,当exec执行完成,内核再从磁盘上载入原来旧进程的信息(数据段和代码段),然后根据原先的信息继续执行代码,是这样吗?

论坛徽章:
0
5 [报告]
发表于 2003-06-27 15:11 |显示全部楼层

fork、exec系列与system、popen区别

啊,我现在明白了。
其实我前面的说法都错了。系统没有保持任何原进程的信息。

还是因为粗心没注意到fork后面实际上子进程就退出了。真不好意思。

论坛徽章:
0
6 [报告]
发表于 2003-06-27 16:15 |显示全部楼层

fork、exec系列与system、popen区别

是不是父进程非法操作啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP