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

本文介绍了在Linux环境中使用C语言通过`mkfifo()`创建命名管道的过程,包括创建管道、使用`fork()`和`popen()`进行进程间通信,以及如何通过`cat`命令读取和`echo`命令写入数据。
摘要由CSDN通过智能技术生成

点击 <C 语言编程核心突破> 快速C语言入门



前言

要解决问题: 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 <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;
}
 

总结

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


点击 <C 语言编程核心突破> 快速C语言入门


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不停感叹的老林_<C 语言编程核心突破>

不打赏的人, 看完也学不会.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值