LinuxSir.cn,穿越时空的Linuxsir!

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

请各位大哥帮我看看这个小程序,谢谢!

[复制链接]
发表于 2006-7-15 09:37:21 | 显示全部楼层 |阅读模式
include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
            pid_t pid;
            if((pid=vfork())<0)
        {
                    printf("fork error! \n");
                    exit(1);
        }
        else if(pid==0)
        {
                    printf("Child process is printing.\n");
        }
        else
        {
                    printf("arent process is printing.\n");
        }

        exit(0);
}


运行后得到的结果是:
Child process is printing
Parent process is printing


书上说:“调用 vfork 时,父进程被挂起,子进程运行至调用 exec 函数或调用 exit 时解除这种状态。”


请教:
这个程序是不是这样运行的:
1:pid=vfork() 产生子进程
2:printf("Child process is printing.\n");
3:exit(0); 子进程结束
4:唤醒父进程
5:printf("arent process is printing.\n");
6:exit(0); 父进程结束
7:退出程序


各位大哥是不是这样啊?

如果我把 exit(0) ,换为 return 1;
可以吗?


#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
            pid_t pid;
            if((pid=vfork())<0)
        {
                    printf("fork error! \n");
                    exit(1);
        }
        else if(pid==0)
        {
                    printf("Child process is printing.\n");
        }
        else
        {
                    printf("arent process is printing.\n");
        }

        return 1;
}


谢谢!
发表于 2006-7-19 20:20:00 | 显示全部楼层
(删除错误观点)
  1. 如果我把 exit(0) ,换为 return 1
复制代码
完全没问题!试试就知道了,我写程序几乎不写exit。
以上个人观点
回复 支持 反对

使用道具 举报

发表于 2006-7-19 20:29:28 | 显示全部楼层
关于 vfrok(2) 你看看手册(man)不就完了, 这有什么好问的?
要是再整个错误的答案那就更惨了 :-)
回复 支持 反对

使用道具 举报

发表于 2006-7-25 00:02:29 | 显示全部楼层
以下摘自unix环境高级编程:
1、v f o r k与f o r k一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中。不过在子进程调用e x e c或e x i t之前,它在父进程的空间中运行。
v f o r k和f o r k之间的另一个区别是: v f o r k保证子进程先运行,在它调用e x e c或e x i t之后父进程才可能被调度运行。(如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。)

2、进程有三种正常终止法。
(a) 在m a i n函数内执行r e t u r n语句。如在7 . 3节中所述,这等效于调用e x i t。
(b) 调用e x i t函数。此函数由ANSI C定义,其操作包括调用各终止处理程序(终止处理程序
在调用a t e x i t函数时登录),然后关闭所有标准I / O流等。因为ANSI C并不处理文件描述符、多进程(父、子进程)以及作业控制,所以这一定义对U N I X系统而言是不完整的。
(c) 调用_ e x i t系统调用函数。此函数由e x i t调用,它处理U N I X特定的细节。_ e x i t是由P O S I X . 1说明的。
回复 支持 反对

使用道具 举报

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

本版积分规则

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