当前位置:  技术问答>linux和unix

请教个父子进程管道问题

    来源: 互联网  发布时间:2016-11-05

    本文导语:  #include  #include  #include  #include  int main() {     int data_processed;     int file_pipes[2];     const char some_data[] = "123";     char buffer[BUFSIZ + 1];     pid_t fork_result;     memset(buffer, '', sizeof(buffer));     if (pipe(file_pip...

#include 
#include 
#include 
#include 

int main()
{
    int data_processed;
    int file_pipes[2];
    const char some_data[] = "123";
    char buffer[BUFSIZ + 1];
    pid_t fork_result;

    memset(buffer, '', sizeof(buffer));

    if (pipe(file_pipes) == 0) {
        fork_result = fork();
        if (fork_result == -1) {
            fprintf(stderr, "Fork failure");
            exit(EXIT_FAILURE);
        }

// We've made sure the fork worked, so if fork_result equals zero, we're in the child process.

        if (fork_result == 0) {
            data_processed = read(file_pipes[0], buffer, BUFSIZ);
            printf("Read %d bytes: %sn", data_processed, buffer);
            exit(EXIT_SUCCESS);
        }

// Otherwise, we must be the parent process.

        else {
            data_processed = write(file_pipes[1], some_data,
                                   strlen(some_data));
            printf("Wrote %d bytesn", data_processed);
        }
    }
    exit(EXIT_SUCCESS);
}



fork  只是创建一个和自身一样的子进程吧,它和父进程只共享代码段,数据段是独立的

也就是说两个进程的 int file_pipes[2]; 之间是毫无关系的

那么父进程往自己的 file_pipes[1] 写数据,那么应该只有自己的file_pipes[0]能读到数据吧,
为什么用子进程的file_pipes[0]能读到父进程管道的数据???

|
虽然子进程的数据段是独立的,但他也不是和父进程没有一点关系。
fork要做的事情之一,就是把父进程的所有数据都copy一份给子进程,从这以后子进程才开始独立。
所以,子进程的int file_pipes[2]; 也是从父进程那里复制过来的。
如果fork之后父进程file_pipes[0]=123,那么子进程是看不到的。
但是实际上父子进程都没有这样的修改,所以两者还是一致的。

|
再来看看这个简单的例子:
int main()
{
    int n1=123, n2=456;
    printf("text");
    if (fork()==0)
        printf("child: n1=%d, n2=%dn", n1, n2);
    else
    {
        n2 = 789;
        printf("parent: n1=%d, n2=%dn", n1, n2);
    }
}

n1、n2的输出很容易理解。
另外你很可能会看到text在父子进程各自输出一次,那是因为fork的时候这几个字符还没有输出到显示器,还在父进程的缓冲区里,也被复制到子进程的缓冲区里然后输出了。

|
管道里面保存的内容不是数据段里面的,它是一个文件,和父子进程共享什么段没关系。
file_pipes[1]这是一个文件描述符fd,它是保存在数据段里面的。
不只是父子进程,任何其他进程,只要有办法得到这个fd,他就可以读取fd对应的文件也就是管道的内容。

|
只是因为无名管道的话其它进程没有很直接的方法获得管道的句柄罢了。理论上来说管道独立于进程并不是只有父子关系的进程才可以共享这个管道。 有名管道跟无各管道的区别就是因为有了名字, 其它进程可以很方便取得管道的句柄而已。


|
只有共同祖先的进程之间才能共享这个管道

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • 请教--父进程监控子进程,欢迎高手进来探讨!!!
  • 请教一个关于子进程和父进程竞争的问题
  • 请教急:shell怎么实现进程监控,重启进程
  • 请教如何编程实现父进程产生多个子进程
  • 请教:进程创建和进程状态有关问题
  • 请教:在Linux下怎么样检测一个进程是否是僵尸进程??
  • 小妹请教各位大哥,在unix下,如何显示进程,和kill掉进程?
  • Linux下请教一个父进程杀死子进程的问题.
  • 各位大侠,请教一个LINUX存储管理的问题,在页换出时系统要锁住正在被换出的进程,若系统不锁住该进程,会发生什么状况?
  • 请教一个多进程编程问题
  • 请教怎么根据进程输出的日记文件内容判断来重起进程?
  • 请教:子进程关闭
  • 请教进程问题
  • 请教LINUX下建立子进程的问题(急急急)!!!
  • 请教进程与变量的问题
  • 请教进程通信
  • 请教:如何利用shell script 去 kill 某个进程
  • 请教:如何设置当前进程的优先级
  • 请教:在进程运行中将其转换成守护进程会怎么样?
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3