08.04有名管道

2024-01-03 02:50
文章标签 管道 有名 08.04

本文主要是介绍08.04有名管道,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1)要求AB进程做通信

  1. A进程发送一句话,B进程接收打印

  2. 然后B进程发送给A进程一句话,A进程接收打印

  3. 重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;

A进程:

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>int main(int argc, const char *argv[])
{//管道1if(mkfifo("./myfifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}//管道2if(mkfifo("./fifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}printf("mkfifo success\n");int fd = open("./myfifo",O_WRONLY);    //读写if(fd < 0){perror("open");return -1;}int fd1 = open("./fifo",O_RDONLY);  //读写if(fd < 0){perror("open");return -1;}ssize_t res = 0;char buf[128];while(1){//输入管道1printf("A-->B:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(write(fd,buf,sizeof(buf)) < 0){perror("write");return -1;}if(strcasecmp(buf,"quit") == 0)break;//接收管道2bzero(buf,sizeof(buf));	res = read(fd1,buf,sizeof(buf));if(res < 0){perror("read");return -1;}else if(0 == res){printf("接收结束\n");break;}printf("A_get:%ld %s\n",res,buf);if(strcasecmp(buf,"quit") == 0)break;}close(fd);close(fd1);return 0;
}

B进程:

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>int main(int argc, const char *argv[])
{//管道1if(mkfifo("./myfifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}//管道2if(mkfifo("./fifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}printf("mkfifo success\n");int fd = open("./myfifo",O_RDONLY);  //读写if(fd < 0){perror("open");return -1;}int fd1 = open("./fifo",O_WRONLY);  //读写if(fd < 0){perror("open");return -1;}ssize_t res = 0;char buf[128];while(1){//接收管道1bzero(buf,sizeof(buf));	res = read(fd,buf,sizeof(buf));if(res < 0){perror("read");return -1;}else if(0 == res){printf("接收结束\n");break;}printf("B get:%ld %s\n",res,buf);if(strcasecmp(buf,"quit") == 0)break;//写入管道2printf("B-->A:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(write(fd1,buf,sizeof(buf)) < 0){perror("write");return -1;}if(strcasecmp(buf,"quit") == 0)break;}close(fd);close(fd1);return 0;
}

 图中1代表B进程,2代表A进程

2)在第一题的基础上实现,AB进程能够随时收发数据(附加题)

A进程:

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#include<pthread.h>int fd,fd1;
ssize_t res = 0;
char buf[128];void* putB(void* arg)
{//写入管道2while(1){fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(write(fd1,buf,sizeof(buf)) < 0){perror("write");return NULL;}}pthread_exit(NULL);
}void* getA(void* arg)
{//接收管道1while(1){bzero(buf,sizeof(buf));	res = read(fd,buf,sizeof(buf));if(res < 0){perror("read");return NULL;}else if(0 == res){printf("接收结束\n");break;}printf("B get:%ld %s\n",res,buf);}pthread_exit(NULL);}int main(int argc, const char *argv[])
{//管道1if(mkfifo("./myfifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}//管道2if(mkfifo("./fifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}printf("mkfifo success\n");fd = open("./myfifo",O_RDONLY);  //读写if(fd < 0){perror("open");return -1;}fd1 = open("./fifo",O_WRONLY);  //读写if(fd < 0){perror("open");return -1;}//创建线程pthread_t tid1,tid2;if(pthread_create(&tid2,NULL,putB,NULL) != 0){perror("pthread_create");return -1;}if(pthread_create(&tid1,NULL,getA,NULL) != 0){perror("pthread_create");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);close(fd);close(fd1);return 0;
}

B进程:

#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#include<pthread.h>int fd,fd1;
ssize_t res = 0;
char buf[128];void* getB(void* arg)
{//接收管道2while(1){bzero(buf,sizeof(buf));	res = read(fd1,buf,sizeof(buf));if(res < 0){perror("read");return NULL;}else if(0 == res){printf("接收结束\n");break;}printf("A_get:%ld %s\n",res,buf);}pthread_exit(NULL);
}void* putA(void* arg)
{//输入管道1while(1){fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;if(write(fd,buf,sizeof(buf)) < 0){perror("write");return NULL;}}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//管道1if(mkfifo("./myfifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}//管道2if(mkfifo("./fifo",0664) < 0){if(errno != 17){perror("mkfifo");return -1;}}printf("mkfifo success\n");fd = open("./myfifo",O_WRONLY);    //读写if(fd < 0){perror("open");return -1;}fd1 = open("./fifo",O_RDONLY);  //读写if(fd1 < 0){perror("open");return -1;}//创建线程pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,putA,NULL) != 0){perror("pthread_create");return -1;}if(pthread_create(&tid2,NULL,getB,NULL) != 0){perror("pthread_create");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);close(fd);close(fd1);return 0;
}

捕获2)3)20)号信号

#include<stdio.h>	
#include<signal.h>
#include<unistd.h>typedef void (*sighandler_t)(int);void handler1(int sig)
{printf("%d %d\n",sig,__LINE__);
}void handler2(int sig)
{printf("%d %d\n",sig,__LINE__);
}int main(int argc, const char *argv[])
{//捕获20号信号SIGINTsighandler_t s = signal(20,handler1);if(SIG_ERR == s){perror("signal");return -1;}printf("%p %d\n",s,__LINE__);s = signal(20,handler2);if(SIG_ERR == s){perror("signal");return -1;}printf("%p %d\n",s,__LINE__);while(1){printf("main");sleep(1);}return 0;
}

这篇关于08.04有名管道的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/564365

相关文章

Redis 管道的神奇力量

今天我们要来探索一个 Redis 中非常强大且实用的特性——管道(Pipeline)。如果你想让你的 Redis 操作更加高效,那么这篇文章绝对值得一读。 一、Redis 管道是什么 Redis 管道是一种在客户端和服务器之间批量执行命令的技术。它允许客户端将多个命令一次性发送到服务器,而不是逐个发送并等待每个命令的响应。服务器会按照顺序执行这些命令,并将所有命令的响应一次性返回给客户端。

【Linux】Linux 管道:进程间通信的利器

文章目录 Linux 管道:进程间通信的利器1. 什么是管道?2. 管道的分类2.1 匿名管道(Unnamed Pipe)2.2 命名管道(Named Pipe,FIFO) 3. 管道的局限性4. 结论 Linux 管道:进程间通信的利器 在 Linux 系统中,管道(Pipe)是进程间通信(IPC, Inter-Process Communication)的重要机制之一。

Linux管道式操作命令

Linux管道(Pipe)是一种将一个命令的输出作为另一个命令输入的技术。管道操作符是|。这种机制非常强大,因为它允许你将多个简单的命令组合成复杂的操作,实现数据的流式处理。 以下是一些常见的管道式操作命令的例子: 1. 查找特定进程 使用ps命令列出所有进程,然后用grep命令过滤出特定的进程。 ps aux | grep nginx 这个命令会列出所有与nginx相关的进程。 2

redis管道piplines优化springboot业务性能

redis本身执行指令的性能非常的高,单台数十万并发不成问题,但是如果一个请求处理流程过长,需要频繁的操作redis,此时无论如何都无法提高系统的并发,归根结底还是网络带来的性能损耗过大,为了降低网络开销,redis支持piplines和lua脚本的方式进行批量处理和返回值,只需要一次网络请求就可以发送数百条操作指令。以下我将对着两种方式的应用场景进行详细的描述。  上图是piplines的

传统管道,匿名管道

二、传统的进程间通信-管道文件     管道是UNIX系统中最古老的进程间通信技术,古老意味着所有系统都支持,早期的管道是半双工通信,现有的系统管道是全双工通信     管道就是一种特殊的文件,数据在文件中是流动的,读取之后就自动消失,如果文件中没有数据则会阻塞     有名管道:基于有文件名的管道文件的通信         编程模型             进程A

吃透Redis系列(三):Redis管道,发布/订阅,事物,过期时间 详细介绍

Redis系列文章: 吃透Redis系列(一):Linux下Redis安装 吃透Redis系列(二):Redis六大数据类型详细用法 吃透Redis系列(三):Redis管道,发布/订阅,事物,过期时间 详细介绍 吃透Redis系列(四):布隆(bloom)过滤器详细介绍 吃透Redis系列(五):RDB和AOF持久化详细介绍 吃透Redis系列(六):主从复制详细介绍 吃透Redi

Linux | 匿名管道和命名管道:进程间通信数据流的桥梁

目录 1、进程间通信目的 2、管道——匿名管道和命名管道 匿名管道 匿名管道的示例代码:将数据写入管道、子进程从管道读取数据并将其输出到bash中 父子进程通过匿名管道建立通信 重点:管道的五个特点 命名管道(也称为FIFO) a. 创建命名管道 - mkfifo() b. 使用open函数打开命名管道文件 c. 读写命名管道- read() 和 write() d. 关闭和

【进程间通信】管道应用场景---简易进程池

#include<iostream>#include<vector>#include<string>#include<cstring>#include<cstdlib>#include<unistd.h>#include<sys/stat.h>#include<sys/wait.h>//把5个子进程要管理起来,要先描述再组织const int processnum=5;//先

【Rust光年纪】极致性能体验:数据管道实现、虚拟化列表和网格布局美化完全攻略

优秀开源库大揭秘:内存分析、数据处理、页面滚动监测、图片延迟加载全指南 前言 在当今的软件开发环境中,存在着各种各样的库和工具,它们为开发人员提供了丰富的功能和技术支持。本文将介绍几个与内存分析、数据处理、页面滚动状态监测、图片延迟加载、虚拟化长列表和网格布局美化相关的优秀库,帮助开发人员更好地理解和利用这些工具。 欢迎订阅专栏:Rust光年纪 文章目录 优秀开源库大揭秘:内

Lesson_for_java_day17--java中的IO流(IO基本流、键盘输入、管道流、文件及文件夹操作、Properties类、切割文件、记录软件运行次数)

IO基本流: 字符流:读操作:Reader 字符输入流 抽象类Reader r = new FileReader(File f);构造方法:FileReader(File file) ;FileReader(String fileName) ;方法://读取一个字符并以整数的形式返回(0~255),//如果返回-1已到输入流的末尾。int read() throws IOException