免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4725 | 回复: 4
打印 上一主题 下一主题

[C] C语言 有关进程,子进程求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-04 13:14 |只看该作者 |倒序浏览
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/uio.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>
#include<sys/wait.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
        char buf[100]={0};
        pid_t cld_pid;
        int fd;
        int status;
        if((fd=open("temp",O_CREAT|O_RDWR|O_TRUNC,0664))==-1){
                perror("创建失败");
                exit(1);
        }
        strcpy(buf,"父进程数据");
        if((cld_pid=fork())==0){
                strcpy(buf,"子进程数据");
                puts("子进程正在工作:");
                printf("子进程PID是:%d\n",getpid());
                printf("父进程PID是:%d\n",getppid());
                write(fd,buf,strlen(buf));
                close(fd);
                exit(0);
        }
        else{
                puts("父进程正在工作:");
                printf("父进程PID是%d:\n",getpid());
                printf("子进程PID是%d:\n",cld_pid);
                write(fd,buf,strlen(buf));
                close(fd);
        }
        wait(&status);
        return 0;
}


执行后,终端显示:
父进程正在工作:
父进程PID是3464:
子进程PID是3465:
子进程正在工作:
子进程PID是:3465
父进程PID是:3464

temp文件内容为:
父进程数据子进程数据


有几个地方不明白。
1.明明用了if else  为什么if条件成立与不成立的内容都会输出。
2.为什么先输出的是ELSE的内容 if条件明明是成立的。
有点似懂非懂的感觉,有点矛盾,这个程序中父进程应该就是程序本身把,调用FORK()创建子进程。子进程执行了,问题就是else中的内容是什么时间执行的,这点真的很不明白。按照输入的内容来看,else的内容是父进程的,先执行父进程,输出父进程的内容,然后调用子进程,输出子进程的内容,似乎是这样。但是明明有if else  else的内容到底为什么会执行。。
既然if成立的内容执行了,else应该是绝对不会执行的才对呀。这里很不明白。
求解答呀,纠结死了。

论坛徽章:
0
2 [报告]
发表于 2013-08-04 13:17 |只看该作者
还有就是
if((fd=open("temp",O_CREAT|O_RDWR|O_TRUNC,0664))==-1){
                perror("创建失败");
                exit(1);

这个exit(1); 是什么意思?exit()不是结束子进程的么?

还有最后的wait(&status);
这个是什么意思,有作用呢?

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
3 [报告]
发表于 2013-08-04 18:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2013-08-05 09:10 |只看该作者
回复 3# c/unix
原来是这样呀 怪不得有时候显示的顺序还不一样  看的书上说的不是很明白
多谢了

   

论坛徽章:
0
5 [报告]
发表于 2013-08-05 13:06 |只看该作者
ELAPSE13LINUX 发表于 2013-08-05 09:10
回复 3# c/unix
原来是这样呀 怪不得有时候显示的顺序还不一样  看的书上说的不是很明白
多谢了


根本原因是:
fork()一次调用,返回两个,而且没有顺序保证,不过有个vfork(),不过它只保证子进程退运行,但也不是保证printf先被调用,这个是调度器决定的,和fork/vfork无关了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP