LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 626|回复: 4

在apue中实例8-1中子进程的pid不是0吗?怎么会得到的pid=430?望高手指点一下,叩谢

[复制链接]
发表于 2010-6-3 09:15:36 | 显示全部楼层 |阅读模式
在apue例题8-1的程序清单如下:
#include "apue.h"
int glob=6;
char buf[]="a write to stdout\n";
int main(void)
{
        int var;
        pid_t pid;
        var=88;
        if(write(STDOUT_FILENO,buf,sizeof(buf)-1)!=sizeof(buf)-1)
                err_sys("write error");
        printf("before fork\n");
        if((pid=fork())<0)
        {
                err_sys("fork error");
        }
        else if(pid==0)
        {
                glob++;
                var++;
        }
        else
        {
                sleep(2);
        }
        printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);
        exit(0);
}
得到的结果是:
a write to stdout
before fork
pid=3314,glob=7,var=89
pid=3313,glob=6,var=88
在这里,程序中只有一条printf("pid=%d,glob=%d,var=%d\n",getpid(),glob,var);语句,结果却有两条信息,怎么回事?fork()函数返回两个值,一个是子进程为0,另一个是父进程,不是0.为什么这里两个pid都不是0?
望高手指点,不胜感激
发表于 2010-6-3 14:33:44 | 显示全部楼层
fork后进程就分成了两个,子进程中fork返回0,父进程中fork返回子进程的pid。这个返回量并不是各自进程的pid,而打印的是进程自己的pid,所以当然不可能是0
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-3 14:38:39 | 显示全部楼层
那为什么会打印两条printf的语句?
回复 支持 反对

使用道具 举报

发表于 2010-6-3 22:09:58 | 显示全部楼层
fork后,子进程又没退出,当然是和父进程一样接着往下执行到程序末端,当然也就都执行了printf那句了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-4 09:30:53 | 显示全部楼层
多谢你的指点,小弟明白了
感激不尽!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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