点击 <C 语言编程核心突破> 快速C语言入门
Linux环境创建命名管道小实验
- 前言
- 一、`mkfifo()`函数AI助手提供协作
- 二、代码
- 总结
前言
要解决问题: Linux
环境用mkfifo()
创建个管道, 但是被阻塞, 发现是管道虽然建立了, 但是没有进程打开它, 以至于阻塞.
想到的思路: 开始时是用fork()
使用子进程创建管道, 但依然阻塞, 后发现是没有进程打开管道, 用fopen()
打开它即可.
其它的补充: 问题地址: Linux操作系统中的,管道通信问题
一、mkfifo()
函数AI助手提供协作
mkfifo是Linux中用于创建命名管道的命令。
下面是一个创建命名管道并使用它进行进程间通信的示例:
$ mkfifo myfifo
在一个终端窗口中运行以下命令以从管道读取数据:
$ cat myfifo
- 在另一个终端窗口中运行以下命令以向管道写入数据:
$ echo "Hello World" > myfifo
- 在第一个终端窗口中,你应该会看到输出
“Hello World”
。
这是一个简单的示例,说明如何使用mkfifo
命令创建命名管道,并使用cat和echo命令对其进行读写。使用命名管道可以方便地在不同的进程中共享数据。
我们需要做的就是将上面的命令行程序编程成为C语言代码.
二、代码
我在原始问题代码上加了一个fork()
, 分了一个子进程, 用于创建管道, 如果管道存在, 子进程退出, 不影响主进程, 如果没有则创建.
在主进程耽搁一秒钟, 用于子进程创建命名管道, 时间是足够的.
调用popen()
, 通过cat myfifo
命令从另一个进程打开管道, 解除阻塞.
当完成管道的输入, pclose()
关闭管道进程.
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>int main()
{printf("%d进程:创建管道...\n", getpid());int err = fork();if (err == 0){if (mkfifo("myfifo", 0666) == -1){perror("mkfifo");return -1;}return 0;}if (err != 0 && err != -1){sleep(1);printf("%d进程:打开管道...\n", getpid());FILE *tt = popen("cat myfifo", "r");int fd = open("myfifo", O_WRONLY);if (fd == -1){perror("open");return -1;}printf("%d进程:发送数据...\n", getpid());char buf[1024];for (;;){printf("> ");fgets(buf, sizeof(buf) / sizeof(buf[0]), stdin);if (!strcmp(buf, "!\n")){break;}if (write(fd, buf, strlen(buf) * sizeof(buf[0])) == -1){perror("write");return -1;}}printf("%d进程:关闭管道...\n", getpid());if (close(fd) == -1){perror("close");return -1;}printf("%d进程:删除管道...\n", getpid());if (unlink("myfifo") == -1){perror("unlink");return -1;}printf("%d进程:完成任务!\n", getpid());pclose(tt);}if (err == -1){return -1;}return 0;
}
总结
在Linux
用mkfifo()
创建命名管道, 实际在文件管理器下看, 是创建一个文件, 然后可以不同进程进行调用, 传递信息, 很有意思.
点击 <C 语言编程核心突破> 快速C语言入门