2 qq 33555452 qq_33555452 于 2017.01.02 22:19 提问

为什么父进程中 把sleep放到35行就不执行子进程的逻辑了呢 放到32行就很正常
 #include <stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc , char **argv)
{
    int fd[2] , n ;
    char c ; 
    pid_t childpid ; 
    pipe(fd);
#if 1
    if((childpid = fork()) == 0)
    {
        if((n = read(fd[0],&c ,1))!= 1)
            perror("no data\n");
        printf("child %c %d %d \n",c ,fd[0],fd[1]);
        write(fd[1],"c",1);
        exit(0);
    }
#endif
    write(fd[1],"p",1);//31
    if((n = read(fd[0],&c ,1))!= 1)
        perror("no data\n");
    printf("parent %c %d  %d \n",c,fd[0],fd[1]);
    sleep(6);//35
    exit(0);

}

1个回答

caozhy
caozhy   Ds   Rxr 2017.01.02 23:13

sleep会阻塞住当前线程,而管道是异步获取的,你单步调试下

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
fork之后子进程与父进程关系
#include #include #include #include void main() { char str[6]="hello"; pid_t pid=fork(); if(pid==0) { str[0]='b'; printf("子进程中str=%s\n",str); printf("子进程中str指向的
时间片轮转调度算法的提及和关于fork函数执行父,子进程先后顺序的理解
时间片轮转调度算法的提及和关于fork函数执行父,子进程先后顺序的理解     fork函数是用来创建进程的,命令行下输入man2 fork 看到他的函数声明: #include  pid_t fork(void);     fork函数调用一次会返回两次值,在成功调用fork函数后,当前进程会分裂为两个进程,一个是当前进程,返回值是子进程的ID;另一个是当前创建的子进
父进程等待子进程结束 waitpid wait
我们一直在强调一个概念就是进程是一个程序执行的实例,是内核在虚拟概念下创建的实体,它实例化的体现在用户态就是程序代码和代码使用的变量(存储空间),在内核态就是内核为我们每个进程所保存的数据结构(状态信息)等。 当一个进程由于某种原因停止时,内核并不是直接将为它保存的状态信息从内核移除,相反,进程会一直被保持在一种已经终止的状态,直到被它的父进程回收,当父进程回收已经终止的子进程时,内核会将子进程的
fork()子进程与父进程执行打印多少个-号问题
//原题是求下列程序会打印多少个-号: #include #include #include #include int main(){ int fpid; for(int i=0;i<2;i++){ printf("- %d\n",i); printf("%d %d %d\n",getppid(),get
vfork函数创建出的父子进程
vfork函数创建新进程的主要目的在于用exec函数执行另外的程序。在没调用exec或exit之前子进程的运行中是与父进程共享数据段的,在vfork调用中,子进程先运行,父进程挂起,直到子进程调用exec或exit,在这之后,父子进程的执行顺序不在有限制。 例:   1 #include   2 #include   3 #include   4 #include   5    6
创建进程 fork()函数的基本使用 父子进程之间的关系
摘要:本文详解介绍fork()函数的基本使用,以及父子进程之间的关系.子进程对变量的改变不会影响到父进程、子进程对父进程文件流缓冲区的处理和子进程对父进程打开的文件描述符的处理.
为什么fork创建子进程后,父进程中运行过的代码在子进程中不再运行了
子进程是父进程的一个完全拷贝,如何理解?为什么fork创建子进程后,父进程中运行过的代码在子进程中不再运行了?
解答:fork()函数执行后,子进程先执行的原因。
写过fork()函数的朋友应该有经验,一般使用fork()函数后,打印执行顺序时总是子进程先执行。但是书上却说fork函数的子进程与父进程之间的执行顺序不确定,原因是什么? 这就涉及到内核一个技术:copy-on-write,即写时拷贝。传统的fork函数调用直接把所有资源复制给新创建的进程,简单,但是浪费!写时拷贝技术是创建新进程时推迟或者不拷贝数据的技术。新创建进程后内核并不复制整个进程的地
并发服务器中的fork函数、 子进程与父进程的区别
#include int fork(void) 返回:在子进程当中为0,在父进程当中表示为子进程ID,若出错则返回-1 fork函数的特性: 1.fork之前打开的所有的描述符(文件描述符、设备描述符、sockfd、管道中的描述符等等)在fork之后由子进程共享的。 2.出了继承打开后的描述符之外,还有其他属性, 例如: 实际用户ID、实际组ID、有效用户ID、有效组ID 附属组
C程序完成:父进程创建一个子进程,父进程对子进程设置一个报警信号,然后父进程等待子进程的结束,如果此时报警信号先到,就终止子进程。
#include #include #include #include #include #include void killchild(int pid_child); void killchild(int pid_child){ printf("killing  child process   \n");   //调用wait函数    int