有名管道多路通信程序
有名管道是一种进程间通信(IPC)机制,它允许两个或多个进程通过一个文件进行通信,有名管道的实现方式是在内核中创建一个缓冲区,然后通过读写这个缓冲区来实现进程间的数据传输,有名管道的特点是半双工通信,即数据只能在一个方向上流动,且只能在具有亲缘关系的进程之间使用。
下面是一个简单的有名管道多路通信程序示例:
1、创建有名管道
#include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> int main() { mkfifo("mypipe", 0666); // 创建一个名为mypipe的有名管道 return 0; }
2、写入数据到有名管道
#include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> int main() { mkfifo("mypipe", 0666); // 创建一个名为mypipe的有名管道 int fd = open("mypipe", O_WRONLY); // 以只写方式打开有名管道 if (fd == 1) { perror("open"); return 1; } const char *data = "Hello, world!"; // 要写入的数据 write(fd, data, strlen(data)); // 将数据写入有名管道 close(fd); // 关闭文件描述符 return 0; }
3、从有名管道读取数据
#include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> int main() { mkfifo("mypipe", 0666); // 创建一个名为mypipe的有名管道 int fd = open("mypipe", O_RDONLY); // 以只读方式打开有名管道 if (fd == 1) { perror("open"); return 1; } char buffer[128]; // 用于存储读取到的数据的缓冲区 ssize_t bytesRead = read(fd, buffer, sizeof(buffer) 1); // 从有名管道读取数据,最大读取字节数为缓冲区大小减1,以便留出空间存储字符串结束符'0' if (bytesRead == 1) { perror("read"); return 1; } buffer[bytesRead] = '\0'; // 添加字符串结束符'0',使buffer成为一个合法的C字符串 printf("Received data: %s ", buffer); // 输出接收到的数据 close(fd); // 关闭文件描述符 return 0; }
编写测试程序
为了测试上述有名管道多路通信程序,我们可以创建多个进程,让它们分别执行写入和读取操作,以下是一个简单的测试程序示例:
1、创建测试程序头文件test_ipc.h
:
#ifndef TEST_IPC_H #define TEST_IPC_H void write_to_pipe(); // 写入数据到有名管道的函数声明 void read_from_pipe(); // 从有名管道读取数据的函数声明 void create_processes(); // 创建进程的函数声明 void wait_for_child(); // 等待子进程结束的函数声明 void cleanup(); // 清理资源的函数声明 #endif //TEST_IPC_H
2、创建测试程序源文件test_ipc.c
:
#include "test_ipc.h" #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> #include <errno.h> #include <string.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/mman.h> // for mmap() and madvise() functions in Linux kernel >= 2.4.0, used to map the pipe into memory for better performance when reading from it in large amounts of data or continuously streaming data from it using select(), poll(), epoll() or similar system calls that monitor file descriptors for readability events (inotify on Linux) or other eventdriven I/O mechanisms available in modern operating systems like Linux, BSD, Solaris, AIX, etc., which are more efficient than traditional blocking I/O operations like read(), write(), recv(), send() and their variants that block the calling process until the requested operation completes or fails with an error condition, respectively.
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/525414.html