C 程序来演示 fork() 和 pipe()

简介: fork() 用于创建子进程。此子进程是原始(父)进程的副本。它是在类Unix操作系统上创建进程的主要方法。

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情


fork() 用于创建子进程。此子进程是原始(父)进程的副本。它是在类Unix操作系统上创建进程的主要方法。


语法:

fork(); 
// 它不接受任何参数,而是返回整数值。它可以返回负、正或零整数值。
复制代码


pipe():用于Linux中的进程间通信。这是一个系统功能。


语法:

int pipe(int pipefd[2]);
复制代码

C 程序来演示 fork() 和 pipe():


编写 Linux C 程序以创建两个进程 P1 和 P2。P1 获取一个字符串并将其传递给 P2。P2 将接收到的字符串与另一个字符串连接起来,而不使用字符串函数,并将其发送回 P1 进行打印。


例子:

Other string is: forgeeks.org
Input  : www.haiyong
Output : www.haiyong.site
Input :  www.code.haiyong
Output : code.haiyong.site
复制代码


解释:

  • 要创建子进程,我们使用 fork()。fork() 返回 :
  • <0 无法创建子(新)进程
  • =0 表示子进程
  • >0 即子进程到父进程的进程 ID。当 >0 时,将执行父进程。
  • pipe() 用于将信息从一个进程传递到另一个进程。pipe() 是单向的,因此,对于进程之间的双向通信,可以设置两个管道,每个方向一个。


例:

int fd[2];
pipe(fd);
fd[0]; //-> 用于使用读端
fd[1]; //-> 用于使用写结束
复制代码


父进程内部: 我们首先关闭第一个管道的读取端 (fd1[0]),然后通过管道的写入端 (fd1[1]) 写入字符串。现在,父进程将到子进程完成。在子进程之后,父进程将关闭第二个管道的写入端(fd2[1]),并通过管道的读取端(fd2[0])读取字符串。


内部子进程: Child 通过关闭管道的写入端 (fd1[1]) 来读取父进程发送的第一个字符串,读取后连接两个字符串并通过 fd2 管道将字符串传递给父进程并退出。

输入

www.haiyong
复制代码


C程序演示 forke() 和 pipe() 的使用


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
  // 我们使用两个管道第一个管道从父级发送输入字符串第二个管道从子级发送连接字符串
  int fd1[2]; // 用于存放第一根管道的两端
  int fd2[2]; // 用于存放第二根管道的两端
  char fixed_str[] = "haiyong.site";
  char input_str[100];
  pid_t p;
  if (pipe(fd1) == -1) {
    fprintf(stderr, "Pipe Failed");
    return 1;
  }
  if (pipe(fd2) == -1) {
    fprintf(stderr, "Pipe Failed");
    return 1;
  }
  scanf("%s", input_str);
  p = fork();
  if (p < 0) {
    fprintf(stderr, "fork Failed");
    return 1;
  }
  // 父进程
  else if (p > 0) {
    char concat_str[100];
    close(fd1[0]); // 关闭第一根管道的读取端
    // 写入输入字符串并关闭第一个管道的写入端。
    write(fd1[1], input_str, strlen(input_str) + 1);
    close(fd1[1]);
    // 等待孩子发送字符串
    wait(NULL);
    close(fd2[1]); // 关闭第二个管道的写入端
    // 从孩子身上读取字符串,打印并关闭阅读端。
    read(fd2[0], concat_str, 100);
    printf("Concatenated string %s\n", concat_str);
    close(fd2[0]);
  }
  // 子进程
  else {
    close(fd1[1]); // 关闭第一个管道的写入端
    // 关闭first的写入端使用第一个管道读取字符串
    char concat_str[100];
    read(fd1[0], concat_str, 100);
    // 将固定字符串与其连接
    int k = strlen(concat_str);
    int i;
    for (i = 0; i < strlen(fixed_str); i++)
      concat_str[k++] = fixed_str[i];
    concat_str[k] = '\0'; // 字符串以“\0”结尾
    // 关闭两个读取端
    close(fd1[0]);
    close(fd2[0]);
    // 写入连接字符串并关闭写入结束
    write(fd2[1], concat_str, strlen(concat_str) + 1);
    close(fd2[1]);
    exit(0);
  }
}
复制代码


输出:


Concatenated string www.haiyong.site



目录
相关文章
|
JavaScript 前端开发 开发工具
基于 Vue3.0 和 Ant Design Vue ,高颜值管理后台UI框架vue-vben-admin运行
基于 Vue3.0 和 Ant Design Vue ,高颜值管理后台UI框架vue-vben-admin运行
1286 1
|
7月前
|
数据采集 人工智能 监控
零代码改造!LoongSuite AI 采集套件观测实战
在 AI 时代,随着模型和应用侧的快速演化,对于推理过程,成本和性能显得尤为重要,而端到端的 AI 可观测是其中至关重要的一环。本文将介绍端到端 AI 可观测的基本概念与痛点,并通过阿里云可观测团队最新开源的 AI 采集套件 LoongSuite Agent 来对大模型应用进行全链路可观测以解决这些痛点。帮助客户无侵入,低成本地进行全链路的大模型可观测。
739 74
零代码改造!LoongSuite AI 采集套件观测实战
|
Java Linux
使用jps强制关闭java进程
使用jps强制关闭java进程
1488 0
使用jps强制关闭java进程
|
18天前
|
人工智能 安全 算法
灵感启发:日产文章 100 篇,打造“实时热点洞察”引擎
Inspo Radar(创作热点捕捉助手)是一套AI原生的实时热点洞察与自动化内容生产系统:通过多智能体协同,5分钟抓取全网热榜,实现热点实时捕捉、深度检索、策略分析与自动化文案生成,助力创作者从“灵感枯竭”迈向日产百篇的工程化创作。
|
SQL 关系型数据库 MySQL
如何快速在表级别做同构或者异构数据库之间的数据迁移/备份
【8月更文挑战第17天】本文介绍在同构与异构数据库间快速迁移/备份表级数据的方法。同构迁移可利用数据库自带工具(如MySQL的`mysqldump`)或管理软件(如phpMyAdmin);异构迁移则推荐使用ETL工具(如Pentaho Data Integration)或数据库复制工具(如SymmetricDS),亦可通过编程方式实现。实施前需测试以确保数据完整准确,并注意处理兼容性问题。
719 4
|
Docker 容器 Linux
幻兽帕鲁存档迁移问题心得_告别存档丢失_进入就掉线
你是不是也遇到了存档文件迁移后,还是让你创建新角色,或者是迁移后没几秒就掉线,我也遇到了一样的问题,花了好半天终于解决了,这里记录分享一下。
8714 4
幻兽帕鲁存档迁移问题心得_告别存档丢失_进入就掉线
|
存储 弹性计算 安全
阿里云服务器配置选择策略参考及后期使用注意事项
对于初次购买阿里云服务器的一些新手用户来说,在云服务器配置选择和后期使用过程中有一些不清楚的地方,小编分享几点阿里云服务器配置选择策略,以及后期使用注意事项,购买过程中注意好下面这些事项,能让我们选对选好阿里云服务器,购买之后,在使用过程中,注意下面这些事项,能够让我们更好、更安全的使用阿里云服务器。下面是小编分享的一份详尽的阿里云服务器配置与使用指南,以供参考和借鉴。
|
机器学习/深度学习 人工智能 算法
【AI系统】AI系统概述与设计目标
本文介绍了AI系统的全栈架构,涵盖设计目标、组成和生态。AI系统旨在连接硬件与应用,提供高效的模型服务和开发支持。文中探讨了高效编程语言、开发框架、工具链的重要性,以及AI任务系统级支持、自动编译优化和云原生自动分布式化等关键设计目标。此外,还详细讨论了AI训练与推理框架、AI编译与计算架构、AI硬件与体系结构等组成部分,以及AI算法和框架、更广泛的生态系统等。
853 1
|
存储 分布式计算 数据可视化
大数据概念与术语简介
大数据概念与术语简介
484 2
|
机器学习/深度学习 分布式计算 监控
典型的Spark应用实例
典型的Spark应用实例
872 1

热门文章

最新文章

下一篇
开通oss服务