首页 > 系统相关 >[Linux] 使用管道进行进程间通信

[Linux] 使用管道进行进程间通信

时间:2023-02-20 16:15:26浏览次数:43  
标签:int father child am 间通信 管道 fd Linux include

什么是管道

父进程向子进程发送消息

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main()
{
	int fd[2];
	int ret = pipe(fd);
	if (ret == -1) {
		perror("pipe error\n");
		return 1;
	}
	pid_t id = fork();
	if (id == 0) {
		//child
		close(fd[1]); //关闭写端
		char msg[100];
		int j = 0;
		while (j<5) {
			memset(msg,'\0',sizeof(msg));
			ssize_t s = read(fd[0], msg, sizeof(msg));
			if (s>0) {
				msg[s - 1] = '\0';
			}
			printf("%s\n", msg);
			j++;
		}
	}
	else if (id>0) {
		//father
		int i = 0;
		close(fd[0]); // 关闭读端
		char *father = "I am  father!";
		while (i<5) {
			write(fd[1], father, strlen(father) + 1);
			sleep(2);
			i++;
		}
	}
    else {//error
		perror("fork error\n");
		return 2;
	}
	return  0;
}
(base) root@iZuf65cax8rsfekcyp3ytyZ:~/testfork# gcc pipe3.c -o pipe3
(base) root@iZuf65cax8rsfekcyp3ytyZ:~/testfork# ./pipe3
I am  father!
I am  father!
I am  father!
I am  father!
I am  father!

子进程向父进程发送消息

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

int main()
{
	int fd[2];
	int ret = pipe(fd);
	if (ret == -1) {
		perror("pipe error\n");
		return 1;
	}
	pid_t id = fork();
	if (id == 0) {
		//child
		int i = 0;
		close(fd[0]); // 关闭读端
		char *father = "I am  child!";
		while (i<5) {
			write(fd[1], father, strlen(father) + 1);
			sleep(2);
			i++;
		}
	}
	else if (id>0) {
		//father
		close(fd[1]); // 关闭写端
		char msg[100];
		int j = 0;
		while (j<5) {
			memset(msg,'\0',sizeof(msg));
			ssize_t s = read(fd[0], msg, sizeof(msg));
			if (s>0) {
				msg[s - 1] = '\0';
			}
			printf("%s\n", msg);
			j++;
		}
	}
    else {//error
		perror("fork error\n");
		return 2;
	}
	return  0;
}
(base) root@iZuf65cax8rsfekcyp3ytyZ:~/testfork# gcc pipe2.c -o pipe2
(base) root@iZuf65cax8rsfekcyp3ytyZ:~/testfork# ./pipe2
I am  child!
I am  child!
I am  child!
I am  child!
I am  child!

标签:int,father,child,am,间通信,管道,fd,Linux,include
From: https://www.cnblogs.com/kirizi/p/17113563.html

相关文章

  • Linux SFTP服务部署
    1、创建sftp组groupaddsftp 2、创建sftp所用的用户#用户名sftpuser,创建用户到用户组,并禁止登录useradd-gsftp-s/bin/falsesftpuser-d/data/sftpuser#修......
  • Linux中产生zombie的原因详解及解决方法!
    zombie英文全称是zombieprocess,中文名为僵尸进程,也就是死掉的进程,那么Linux中产生zombie的原因是什么?具体内容请看下文。僵尸进程,英文名zombieprocess,顾名思义......
  • nginx 注册Linux 开机启动
    nginx注册Linux开机启动前提已经安装好了,nginx(查看之前的文章) cd  /usr/lib/systemd/system/[root@machine138keepalived]#cd/usr/lib/systemd/system/[r......
  • linux编译安装gcc5.3.0
    1、下载GCC5.3.0安装包#su#cd/opt#wgethttp://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz2、解压#tar-zxfgcc-5.3.0.tar.gz3、创建安装目录#mkdir......
  • Linux学习笔记
    第一章:初识Linux1、LinuxLinux是一套免费和自由传播的类UNIX操作系统(类UNIX系统:是指继承UNIX的设计风格演变出来的系统),是基于POSIX和UNIX的多用户、多任务、支持多线程和......
  • 10个有趣的 Linux Shell 脚本面试与解答
    Linux的浩瀚无垠,使人总能每次都提交与众不同的内容。这些内容不仅对他们的职业生涯很有用,同时也让他们增长知识。在此,我们就尝试这么去做,至于能取得多大的成功,就由我们的读......
  • linux利用source命令导入sql文件
    1.创建数据库2.设置编码3.进入sql文件目录,使用msyql的source命令如下:source文件路径mysql>useg6monitor;mysql>source/app/t_sta_high_emission_vehicle.sql; ......
  • linux进阶命令
     1.linux中>表示覆盖原文件内容(文件的日期也会自动更新),>>表示追加内容(会另起一行,文件的日期也会自动更新)。  catid_rsa.pub >>authorized_keys  把id_rsa.pub追......
  • linux端口映射
    Linux或Windows上实现端口映射入门小站 入门小站 2023-02-1621:50 发表于湖北收录于合集#Linux704个#windows23个#端口映射2个入门小站分享运......
  • 重拾JAVA——Linux 常见命令与环境搭建
    前言:java程序常见运行再linux系统下,所以学习linux常见命令与环境搭建也是比较重要的环节;个人因为工作原因接手java项目,需要Linux环境下部署,习惯了window下图像化操作,不要......