注册完域名后如何做网站,网站开发都需要什么工作,基本建设程序,wordpress+开发入门点击 C 语言编程核心突破 快速C语言入门 Linux环境创建命名管道小实验 前言一、mkfifo()函数AI助手提供协作二、代码总结 前言
要解决问题: Linux环境用mkfifo()创建个管道, 但是被阻塞, 发现是管道虽然建立了, 但是没有进程打开它, 以至于阻塞.
想到的思路: 开始时… 点击 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.hint 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语言入门