红联Linux门户
Linux帮助

关于fork函数的问题

发布时间:2008-04-03 07:54:25来源:红联作者:renwei1986
大家好!
我前几天编写了一个关于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
这个结果。
这是为什么呢?

谢谢!
文章评论

共有 3 条评论

  1. xtuzhxing 于 2008-04-03 21:35:39发表:

    为了证实以上代码,你可以用一个写一个往文件中追加文字的代码,这些代码在fork之前,然后fork一下,你会发现文件增加了两倍的字符。

  2. xtuzhxing 于 2008-04-03 21:30:08发表:

    fork就是建立一个和原来的父进程一样的进程。
    可以这样的理解。你新建了一个进程。他的代码和父进程的代码一样。
    这是在幕后发生的。你感觉不到有两个线程在跑,而他们实际存在。

    那么要让两个进程执行不同的任务,你就要判断这个进程是父进程还是子进程,这时可以根据fork的返回值来判断。

    据说fork的目的是减小新建进程的开销,但是fork出来的进程也增加了不必要的代码。

  3. minux 于 2008-04-03 09:20:45发表:

    问题一:关于fork的返回值是个复杂的问题,有兴趣的话用1小时+来看看http://www.xici.net/b39141/d14405824.htm
    第二个问题其中也有答案,跟系统调度有关系,你可以尝试运行你的程序N次,总有一次是不同的或者让父进程sleep