点击 <C 语言编程核心突破> 快速C语言入门
Linux环境创建命名管道小实验
前言
要解决问题: 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语言入门