关于fork多进程中printf的问题

int main() {   printf("hello world");   fork();   return0; }   //输出为hello worldhello world  int main() {   printf("hello world\n");   fork();   return0; }   //输出为hello world 

printf是向标准输出(stdout)输出你要打印的东西,而默认的stdout是line buffering,也就是以行方式缓存的,
所以当你打印的东西不够一行(没有\n)的时候,这些信息是保存在stdout的buffer中,然后你fork,
这样父进程和子进程的stdout的buffer就都包含有你没有打印出来的内容,当这两个进程结束的时候,b
uffer中的内容会被打印出来,这样你就看到了两次 hello world.  而第二个程序中,你打印的东西够了一行(有\n结束),
所以在fork之前,信息就被打印出来了,
fork之后父进程和子进程stdout的buffer中都是空的了,
所以你就只看到一次hello world.  
解决第一个程序的问题的方法是 printf("hello world"); fflush(stdout); //手动将stdout缓存的内容打印出来。 fork(); 


这是一个简单的 创建子进程,然后子进程各自运行 的程序

在看之前首先思考3个问题

(1)child1,child2是child的子进程么?

(2)红字部分程序会执行几次?

(3)蓝字部分程序会执行几次?

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

 

int main(woid)
{
    pid_t child1,child2,child;
    child1=fork();
    printf("hello world");
    child2=fork();
    printf("hello fq!!!");
    if(child1==-1){
        perror("child1 fork");
        exit(1);
    }
    else if(child1==0){
        printf("In child1 : execute 'ls -l'\n");
        execlp("ls","ls","-l",NULL);
    }
   
    if(child2==-1){
        perror("child2 fork");
        exit(1);
    }
    else if(child2==0){
        printf("In child2 :sleep for 10 seconds and then exit\n");
        sleep(10);
        exit(0);
    }
    else{
        printf("In father process:\n");
        do{
            child=waitpid(child2,NULL,WNOHANG);
            if(child==0){
                printf("The child2 process has not exited!\n");
                sleep(1);
         }
        }while(child==0);
        if(child==child2)
            printf("Get child2\n");
        else
            printf("Error occured!\n");
    }
}

最终 红字部分执行了4次,蓝字部分执行了2

 

程序本来有一个进程child

 child1=fork();
这句话创造了1个进程,child的子进程child1

 child2=fork();

这句话创造了2个进程:

child的另外一个子进程child2;

child1的一个子进程child2(相当于包含了child1的内容)。

 

因为有4个进程,所以所有不需要条件判断的输出语句都会执行4次

蓝子部分是由child的子进程child1,child1的子进程child2各执行了一次,所以是2次
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值