• 使用pipe()与fork()函数通过管道实现父子进程之间的通信


    学习Unix遇到一个题目,要求使用pipe(),fork()函数编写一个程序,能够通过管道实现父子进程之间的通信。
    对于fork()函数,调用一次,返回两次:在子进程中返回0;在父进程中返回子进程的进程ID;出错则返回-1。


    为什么子进程中只需返回0,而无需返回父进程的进程ID?
          子进程中可以调用getppid()函数来获得父进程的进程ID


    为什么在父进程中要返回子进程的进程ID?
          一个父进程可能有多个子进程,所以在调用fork()函数创建新进程是就需要保存新创建的子进程的进程ID


    管道的创建:
    int    pipe(int filedes[2]) 成功返回0; 出错返回-1。filedes[0]用于读管道,filedes[1]用于写管道。这样,如果进程向filedes[1]写入数据,那么就会从filedes[0]顺序读出来。如果仅有一个进程,创建一个这样的管道交换进程内的数据没什么意义。程序像访问文件一样地访问管道,write()将数据写入管道,read()从管道中读出写入的内容。
    理解了这些,我们可以很容易的写出程序:

    #include <stdio.h>
    #include
    <unistd.h>
    int main()
    {
      
    int filedes[2];
      
    char buf[10];
       pipe(filedes);
      
    if(fork() ==0)
       {
         sprintf(buf,
    "%s","ab");
         write(filedes[
    1],buf,sizeof(buf));
       }
      
    else
       {
         read(filedes[
    0],buf,sizeof(buf));
         printf(
    "%s\n",buf);
       }
      
    return 0;
    }
    ---
    可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
  • 相关阅读:
    Nodejs服务器搭建
    CRC8校验,生成多项式:X8 + X2 + X + 1
    windows server 2019添加开机启动项
    Ubuntu20.04下SSH2安装, gulp live报错解决
    Ubuntu 20.04 开机执行自定义脚本
    STUN/TURN服务器搭建
    PostgreSQL开启远程连接
    Ubuntu 20.04 开机执行自定义脚本
    CentOS下 rpm软件包的安装与卸载
    Ubuntu18.04安装JDK1.8.0_11
  • 原文地址:https://www.cnblogs.com/null00/p/2065098.html
Copyright © 2020-2023  润新知