我前几天编写了一个关于fork的函数。书上说fork是执行两次返回的函数,我这有点不大明白。
编写代码如下
#include
#include
#include
#include
int main( void )
{
pid_t pid ;
pid = fork() ;
if( pid < 0 )
{
printf( "Fork Error\n" ) ;
exit( 1 ) ;
}
else if( pid == 0 )
{
printf( "Child Process is printing\n" ) ;
}
else
{
printf( "Parent Process is printing\n" ) ;
}
//return EXIT_SUCCESS ;
exit( 0 ) ;
}
而我调试如下:
(gdb) break main
Breakpoint 1 at 0x80483f5: file fork.c, line 10.
(gdb) s
The program is not being run.
(gdb) run
Starting program: /home/renwei/fork
Breakpoint 1, main () at fork.c:10
10 pid = fork() ;
(gdb) display pid
1: pid = 3171264
(gdb) s
Child Process is printing
12 if( pid < 0 )
1: pid = 29603
(gdb) s
Parent Process is printing
Program exited normally.
我想问的是fork的第一个问题是:pid==0这个条件是怎么执行的
第二个问题是:书上说fork函数派生的子进程与父进程无关,父进程先返回或子进程先返回的情况都有可能发生,因此运行这段程序时,显示的结果可能是
Child Process is printing
Parent Process is printing
也有可能是
Parent Process is printing
Child Process is printing
。
但是我在运行时一直出现的是
Child Process is printing
Parent Process is printing
这个结果。
这是为什么呢?
谢谢!
xtuzhxing 于 2008-04-03 21:35:39发表:
为了证实以上代码,你可以用一个写一个往文件中追加文字的代码,这些代码在fork之前,然后fork一下,你会发现文件增加了两倍的字符。
xtuzhxing 于 2008-04-03 21:30:08发表:
fork就是建立一个和原来的父进程一样的进程。
可以这样的理解。你新建了一个进程。他的代码和父进程的代码一样。
这是在幕后发生的。你感觉不到有两个线程在跑,而他们实际存在。
那么要让两个进程执行不同的任务,你就要判断这个进程是父进程还是子进程,这时可以根据fork的返回值来判断。
据说fork的目的是减小新建进程的开销,但是fork出来的进程也增加了不必要的代码。
minux 于 2008-04-03 09:20:45发表:
问题一:关于fork的返回值是个复杂的问题,有兴趣的话用1小时+来看看http://www.xici.net/b39141/d14405824.htm
第二个问题其中也有答案,跟系统调度有关系,你可以尝试运行你的程序N次,总有一次是不同的或者让父进程sleep