- 论坛徽章:
- 0
|
10可用积分
原贴位置:http://linux.chinaunix.net/bbs/thread-903338-1-1.html
由于vfork的设计是为了子进程由于调用exec或exit而提高效率。
环境编程:
v f o r k与f o r k一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用e x e c (或e x i t ),于是也就不会存访该地址空间。不过在子进程调用e x e c或e x i t之前,它在父进程的空间中运行。这种工作方式在某些U N I X的页式虚存实现中提高了效率。
所以vfork的使用是不合理的。
但我做了下面测试:
代码调整:
#include <stdlib.h>
#include <stdio.h>
void err_sys(char* arg, ...)
{
exit(1);
}
void f1();
void f2();
int main()
{
f1();
fprintf(stderr, "%d:after fork\n", getpid());
f2();
fprintf(stderr, "%d:main\n", getpid());
exit(0);
}
void f1()
{
pid_t pid;
fprintf(stderr, "%d:f1\n", getpid());
if((pid=vfork())<-1)
err_sys("vfork error");
}
void f2()
{
fprintf(stderr, "%d:f2\n", getpid());
}
一次运行结果:
30308:f1
30309:after fork
30309:f2
30309:main
30308:main
屏蔽红色部分(即"f2();")一次运行结果:
30318:f1
30319:after fork
30319:main
30318:after fork
30318:main
即子进程对f2的调用导致父进程的某些东西被修改了导致父进程在子进程exit后从f2()调用后开始执行,问题就是被修改的这些东西是什么呢?
[ 本帖最后由 apony 于 2007-7-13 10:25 编辑 ] |
最佳答案
查看完整内容
系统调用有相当一部分是inline函数,涉及不到出入栈。fprintf和exit不知道在那里找源码,以_exit为例。include/asm-i386/unistd.h#define __NR_exit 1#define __NR__exit __NR_exit#define __syscall_return(type, res) \do { \ if ((unsigned long)(res) >= (unsigned long)(-125)) { \ errno = -(res); \ res = -1; \ } \ return (type) (res); \} while (0)#define _syscall1(type,name,type1,arg1) \type name(typ ...
|