首次发帖,急问个问题,想了半天想不通~~~~~
int main()
{
printf("main %d\n",getpid());//打印语句1
pid_t i=fork();
printf("main_2 %d\n",getpid());//打印语句2
if(i==0)
printf("i%d,i%d\n",i,getpid());//打印语句3
else
printf("i%d,i%d\n",i,getpid());//打印语句5
}
大家看一下上面这个程序,就是在main()里面创建了一个新进程,然后测试每一个语句到底处于什么进程中,输出结果如下:
main 1834 //语句1
main_2 1835 //语句2
i0,i1835 //语句3
main_2 1834 //语句4
i1835,i1834 //语句5
输出结果中的1,2,3,5我没什么疑问,就是第4句想不通,为什么在进入父进程空间的时候会调用之前的打印语句2:0wl;l1 ???
我新学的,比较愚蠢,请各位讲的详细一点,谢谢~~~~~~~~~~(o):tx
[ 本帖最后由 scylla 于 2008-8-11 12:50 编辑 ]
scylla 于 2008-08-11 21:59:43发表:
好的,谢谢2位,我现在基本上理解了。
我看的是linux程序设计第3版,unix环境高级编程电子版非常清楚,不打算买了,太贵。。再说和linux这本很多重复了。
lizewen 于 2008-08-11 21:25:54发表:
子进程会复制父进程的数据与堆栈空间,并继承父进程的UID,GID,环境变量,以打开的文件代码,工作目录和资源限制。Linux使用copy-on-write技术,只有当子进程企图修改预复制的空间时才会做到真正的复制操作,由于继承的信息是复制而来的,不是相同的内存空间,子进程对这些变量的修改和父进程不会同步,这和线程不同。Linux下用fork()生成的子进程,不保证子进程比父进程先执行,所以你的那段代码,父子进程的输出语句可能会交替出现。另外,Stevens的《unix环境高级编程》是本圣经,但毕竟不是函数手册,以后遇到问题多查下手册。
scylla 于 2008-08-11 18:20:55发表:
我下载了unix 环境高级编程电子版,上面讲的详细一点。
我现在知道在fork()之后如果不判断,那fork()之后所有的语句父子进程全部都要执行一遍,fork()之前的语句只是父进程执行。
好多书上都说子进程复制父进程的什么什么的。。但是具体到底复制了什么都没讲清楚。
ufwt 于 2008-08-11 16:51:23发表:
如果不判断,就是2个进程全部执行!
scylla 于 2008-08-11 13:25:01发表:
对了,书上的例子都是在pid_t i=fork()之后立即用if(i==0)。。。(i>0)。。。进行使用。
我就是想知道在fork()后不进行判断,直接写语句,哪这些语句到底是处在哪个进程中呢?
scylla 于 2008-08-11 13:20:08发表:
fork的时候,如果return 0,就是子进程,>0就是父进程,这个我知道啊。
楼上的意思是不是在进入父进程空间(>0)的时候会再调用父进程中的语句呢?那fork的父进程就是main()主函数啊,如果要调用main()中的语句,为什么只调用了main_2,其他语句为什么没执行?
我就是想知道为什么main_2这句会在父进程中也执行一次。看了好几本书上都没讲到这个(5ty(
ufwt 于 2008-08-11 13:10:50发表:
看一下unix编程的书把,如《unix 高级编程>
fork的时候,如果return 0,就是子进程,>0就是父进程,
你这个main_2会再父子进程中全部运行的