QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1021|回复: 8

fork函数的疑问

[复制链接]
发表于 2004-4-25 17:04:52 | 显示全部楼层 |阅读模式
我的一端程序
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
        pid_t pid;

        pid = fork();
        if( pid == 0 )
        {
                printf("child process\n");
        }
        else if( pid != -1 )
        {
                printf("parent process\n");
        }
        else
        {
                printf("error\n");
        }
        return 0;
}

为什么执行pid = fork();派生出来的子进程中就不再派生新的子进程了呢?
发表于 2004-4-26 10:21:01 | 显示全部楼层
我认为子进程中不会再fork子进程了(如果这样,不是无穷无尽了吗?),因为子进程和父进程都只会从fork后开始执行,这后面没有fork了吧?可能没理解你的意思,如果不对再探讨探讨。
回复

使用道具 举报

 楼主| 发表于 2004-4-26 23:04:21 | 显示全部楼层
我的问题就是为什么子进程中不会再fork子进程了,是不是Linux响应fork时先判断发出fork请求的是不是子进程,如果不是子进程就派生,如果已经是就直接返回0了呢
回复

使用道具 举报

 楼主| 发表于 2004-4-26 23:08:59 | 显示全部楼层
sagaeon:
   因为子进程和父进程都只会从fork后开始执行

这个我不能理解,如果子进程和父进程都只从fork后开始执行,那fork调用谁来发出呢?不可能是操作系统先检测有没有fork之类调用然后确定程序从哪里开始执行吧
回复

使用道具 举报

发表于 2004-4-27 08:32:46 | 显示全部楼层
the fork creates a new process by making a copy of the parent's image in memory. The child inherits most of the parent's attributes including environment and privileges.
其中包括register set,当然也包括ip, the register containing the address of the currently executing instruction
这时父进程已经执行完了fork,ip指向的是fork后面的指令
子进程的ip和父进程一样的,所以当然也就不会在执行fork了,除非有循环
回复

使用道具 举报

发表于 2004-4-27 10:23:13 | 显示全部楼层
fork调用一次(父进程),但是返回两次(在子进程与父进程中)!不知这样说是否和你的意思一致。
回复

使用道具 举报

发表于 2004-4-27 12:36:11 | 显示全部楼层
猜想:
父进程执行fork后,由操作系统把父进程所拥有的内存复制一份,然后操作系统在对待这两个进程的时候,都会从fork后继续运行。
回复

使用道具 举报

发表于 2004-4-27 19:55:37 | 显示全部楼层
不知hanzp明白了没有,看了几位高手的解答,我倒是学到了不少,
回复

使用道具 举报

 楼主| 发表于 2004-4-27 23:43:49 | 显示全部楼层
有点明白了,fork在父进程和子进程中各返回一次,然后继续执行后面的代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 11:38 , Processed in 0.077641 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表