免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: dulao5

[函数] 大家不觉得fork和exec函数很奇怪吗? [复制链接]

论坛徽章:
0
发表于 2006-06-16 17:08 |显示全部楼层

回复 10楼 isjfk 的帖子

popen, system 都算吧。 fork + exec。

论坛徽章:
0
发表于 2006-06-16 17:08 |显示全部楼层
原帖由 isjfk 于 2006-6-16 16:48 发表

我记得好像是有,只不过把 fork 和 exec 包装了一下而已。很少用到。


我是说由内核实现成新的系统调用

看来创造者懒惰、然后fork和exec实现的高明,于是后人只好习惯这种东西了

//ps我的确看书了啊,但是只看到失败返回,没看到成功后的返回处理。冥思苦想了很久。我不是那种自己不研究轻易问别人的人

论坛徽章:
0
发表于 2006-06-16 17:11 |显示全部楼层
原帖由 hqx8211 于 2006-6-16 17:08 发表
popen, system 都算吧。 fork + exec。


这种不是系统调用,还是不能避免把内存空间复制两次的麻烦。
当然,我不是说这样不好,实际上虽然需要复制两次,但是unix用了很多技术让这种实现做到了高效。
我只是说没必要这样

哈哈,也许在那个年代,老式的unix主机只有一个进程,没想到多进程的事情?后来用fork做了补丁?哈哈,开个玩笑。

论坛徽章:
0
发表于 2006-06-16 17:23 |显示全部楼层
原帖由 dulao5 于 2006-6-16 17:11 发表


这种不是系统调用,还是不能避免把内存空间复制两次的麻烦。
当然,我不是说这样不好,实际上虽然需要复制两次,但是unix用了很多技术让这种实现做到了高效。
我只是说没必要这样

哈哈,也许在那个年代, ...

晕~
还没见过这么自以为是的人~

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-06-16 17:23 |显示全部楼层
原帖由 dulao5 于 2006-6-16 17:08 发表


我是说由内核实现成新的系统调用

看来创造者懒惰、然后fork和exec实现的高明,于是后人只好习惯这种东西了

//ps我的确看书了啊,但是只看到失败返回,没看到成功后的返回处理。冥思苦想了很久。我不是那 ...

#include <unistd.h>
int execl(const char * p a t h n a m e, const char * a rg 0, ... /* (char *) 0 */);

int execv(const char * p a t h n a m e, char *const a rgv [] );

int execle(const char * p a t h n a m e, const char * a rg 0, ...
                /* (char *)0, char *const e n v p [] */);

int execve(const char * p a t h n a m e, char *const a rgv [], char *const envp [] );

int execlp(const char * f i l e n a m e, const char * a rg 0, ... /* (char *) 0 */);

int execvp(const char * f i l e n a m e, char *const a rgv [] );

                                                                      六个函数返回:若出错则为-1 ,若成功则不返回

这个是书上拷贝的,你敢说你仔细看了?

论坛徽章:
0
发表于 2006-06-16 17:23 |显示全部楼层
实际上有人注意到这个性能问题,因而创造了 vfork 这个函数。你可以看看这个函数的文档。这个函数不会产生额外的内存复制,在它执行完之后必须马上执行 exec。只不过后来这个函数暴露出一些问题,而且后来 fork 用 copy-on-write 重新实现了,效率并不会低多少,所以现在并不推荐使用 vfork 了。

论坛徽章:
0
发表于 2006-06-16 17:27 |显示全部楼层
原帖由 isjfk 于 2006-6-16 16:42 发表

fork 的作用只是“克隆”一个自身,有很多程序都只 fork 而不 exec 的,比如 apache。你可以把这看成 UNIX 的哲学:一个工具只做一件事,并且要把它做好。


我前面已经考虑过了fork的两种情况,执行分支和exec 。只是讨论exec

刚才没看到unix哲学的问题,不过我感觉:
两个系统调用创建一个进程 和 一个系统调用创建一个进程 ,后者的方式更符合unix简单的哲学

论坛徽章:
0
发表于 2006-06-16 17:35 |显示全部楼层
to 莫愁:
  只是开个玩笑

to lenovo大法师:
    对不起我的确没看到,但是就算看到这句,我还是要发这个帖子的。一个不返回的函数肯定是奇怪的。我已经想到了exec执行成功后,栈早就破坏了,所以不能返回。但是这不是很奇怪吗?
    其实我感到奇怪的是,这里用了非常规的方式。这不是c语言范畴之内的,所以感到奇怪。自己分析了以后,感到又奇怪又兴奋,所以才发帖子印证一下。

我的unix学习才刚刚开始,论坛不就是用来交流的嘛。如果没有论坛,我恐怕只有几年后研究完源代码再和别人讨论这个问题。

论坛徽章:
0
发表于 2006-06-16 17:39 |显示全部楼层
谢谢 isjfk  , vfork的问题我再多想想……

论坛徽章:
0
发表于 2006-06-16 23:56 |显示全部楼层
原帖由 dulao5 于 2006-6-16 17:27 发表


我前面已经考虑过了fork的两种情况,执行分支和exec 。只是讨论exec

刚才没看到unix哲学的问题,不过我感觉:
两个系统调用创建一个进程 和 一个系统调用创建一个进程 ,后者的方式更符合unix简单的哲学

你在编码的时候,有定义:

  1. a = 1;
  2. b = 2;
复制代码


如果你想用他们的和作为操作数,你是会定义:
  1. c = a + b;
复制代码


还是定义
  1. c = 1 + 2;
复制代码
???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP