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



目录
相关文章
|
存储 缓存 编解码
【FFmpeg 视频播放】深入理解多媒体播放:同步策略、缓冲技术与性能优化(一)
【FFmpeg 视频播放】深入理解多媒体播放:同步策略、缓冲技术与性能优化
970 0
|
SQL 关系型数据库 MySQL
如何快速在表级别做同构或者异构数据库之间的数据迁移/备份
【8月更文挑战第17天】本文介绍在同构与异构数据库间快速迁移/备份表级数据的方法。同构迁移可利用数据库自带工具(如MySQL的`mysqldump`)或管理软件(如phpMyAdmin);异构迁移则推荐使用ETL工具(如Pentaho Data Integration)或数据库复制工具(如SymmetricDS),亦可通过编程方式实现。实施前需测试以确保数据完整准确,并注意处理兼容性问题。
935 4
|
JavaScript 前端开发 API
一文深入了解Vue2和Vue3的区别
Vue3 相比 Vue2 来说,Vue3 重写了虚拟 Dom 实现,编译模板的优化,更高效的组件初始化,undate性能提高 1.3 ~ 2 倍,SSR 速度提高了 2 ~ 3 倍。
4509 0
一文深入了解Vue2和Vue3的区别
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
SQL 缓存 关系型数据库
MySQL常见问题解决和自动化安装脚本
这篇内容包含了两个主要部分:解决MySQL登录问题和处理GPG密钥问题。当MySQL密码正确但无法登录时,可以通过执行SQL命令`ALTER USER`和`flush privileges`来修改和重置密码。对于MySQL安装时的GPG密钥错误,首先需要强制删除旧的MySQL仓库包,导入新的GPG公钥,然后安装MySQL服务器。如果遇到GPG检查错误,可以使用`--nogpgcheck`参数忽略检查来安装。最后,提供了一个自动化安装MySQL的脚本,用于检查旧版本、卸载残留、安装MySQL8并启动服务。
1822 1
MySQL常见问题解决和自动化安装脚本
|
存储 安全 Linux
C++文件格式深度解析:从底层结构到关键特性
C++文件格式深度解析:从底层结构到关键特性
1421 3
C++文件格式深度解析:从底层结构到关键特性
|
存储 缓存 DataWorks
DataWorks操作报错合集之配置项目连通oss数据源 , 报The request signature we calculated does not match the signature you provided.如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
机器学习/深度学习 分布式计算 监控
典型的Spark应用实例
典型的Spark应用实例
1029 1
|
前端开发 API
vue+canvas实现手写签字画板
vue+canvas实现手写签字画板
640 0