zoukankan      html  css  js  c++  java
  • Linux 利用管道父子进程间传递数据

    [原文

    fork()函数:用于创建子进程,子进程完全复制父进程的资源,相当于父进程的拷贝。具体理解,运用父进程的同一套代码,通过判断进程ID来执行不同进程的不同任务。

    返回值正常为子进程ID,出错返回负值。

    pipe()函数:用于创建管道,返回负值表示创建失败。

     

    简单实例:

     功能:父进程通过管道向子进程传递字符串,然后子进程向屏幕打印出所收到的字符串。

    [objc] view plain copy
    1. <pre class="objc" name="code">#include <stdio.h>  
    2. #include <unistd.h>  
    3. #include <sys/types.h>  
    4.   
    5. int main(void)  
    6. {  
    7.     int n,fd[2];  
    8.     pid_t pid;  
    9.     char line[1024];  
    10.       
    11.     if (pipe(fd) < 0)  
    12.         return 1;  
    13.     if ((pid=fork()) < 0)  
    14.         return 1;  
    15.     else if (pid > 0)    //parent  
    16.     {  
    17.         close(fd[0]);   //close parent's read-port  
    18.         write(fd[1],"I am from parent! ",19);  //write to pipe  
    19.     }  
    20.     else    //child  
    21.     {  
    22.         close(fd[1]);   //close child's write-port  
    23.         n = read(fd[0],line,1024);  //read from pipe  
    24.         printf("%s%d ",line,n);  
    25.     }  
    26.     printf("I am public! ");  
    27.     return 1;  
    28. }  


     


    运行结果:

    I am public!
    I am from parent!
    19
    I am public!

     

    通过上面实例,可以清楚认识父子进程运行情况;通过关闭父进程读端口,关闭子进程写端口实现数据由父进程传向子进程的单向管道传输。

  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/wxmdevelop/p/7732015.html
Copyright © 2011-2022 走看看