2023-11-29 Linux环境创建命名管道小实验


点击 快速C语言入门


Linux环境创建命名管道小实验

  • 前言
  • 一、`mkfifo()`函数AI助手提供协作
  • 二、代码
  • 总结


前言

要解决问题: Linux环境用mkfifo()创建个管道, 但是被阻塞, 发现是管道虽然建立了, 但是没有进程打开它, 以至于阻塞.

想到的思路: 开始时是用fork()使用子进程创建管道, 但依然阻塞, 后发现是没有进程打开管道, 用fopen()打开它即可.

其它的补充: 问题地址: Linux操作系统中的,管道通信问题


一、mkfifo()函数AI助手提供协作

mkfifo是Linux中用于创建命名管道的命令。

下面是一个创建命名管道并使用它进行进程间通信的示例:

$ mkfifo myfifo

在一个终端窗口中运行以下命令以从管道读取数据:

$ cat myfifo
  1. 在另一个终端窗口中运行以下命令以向管道写入数据:
$ echo "Hello World" > myfifo
  1. 在第一个终端窗口中,你应该会看到输出“Hello World”

这是一个简单的示例,说明如何使用mkfifo命令创建命名管道,并使用cat和echo命令对其进行读写。使用命名管道可以方便地在不同的进程中共享数据。

我们需要做的就是将上面的命令行程序编程成为C语言代码.

二、代码

我在原始问题代码上加了一个fork(), 分了一个子进程, 用于创建管道, 如果管道存在, 子进程退出, 不影响主进程, 如果没有则创建.

在主进程耽搁一秒钟, 用于子进程创建命名管道, 时间是足够的.

调用popen(), 通过cat myfifo命令从另一个进程打开管道, 解除阻塞.

当完成管道的输入, pclose()关闭管道进程.

#include 
#include 
#include 
#include 
#include 
 
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;
}
 

总结

Linuxmkfifo()创建命名管道, 实际在文件管理器下看, 是创建一个文件, 然后可以不同进程进行调用, 传递信息, 很有意思.


点击 快速C语言入门


你可能感兴趣的:(笔记,linux,命名管道)