在单个进程中使用命名管道

时间:2010-02-12 12:20:40

标签: c ipc named-pipes

我正在尝试使用命名管道进行流程内的通信。 这是代码

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>

void sigint(int num)
{
    int fd = open("np", O_WRONLY);
    write(fd, "y", 1);
    close(fd);
}

main()
{
    char ch[1];
    int fd;

    mkfifo("np", 0666);

    signal(SIGINT, sigint);

    fd = open("np", O_RDONLY);

    read(fd, ch, 1);

    close(fd);

    printf("%c\n", ch[0]);
    return;
}

我想要的是主要阻止直到写入管道的东西。 问题是信号处理程序sigint()在打开管道后也会阻塞。如果管道已经打开以便在main()之前读取?

,这应该发生吗?

2 个答案:

答案 0 :(得分:3)

你在open()中阻塞,打开一个fifo来读取块,直到有人打开它进行写作。

打开一个用于编写块的fifo,直到有人打开它进行阅读。

信号处理程序在与main()相同的线程中运行,因此您将遇到死锁。两者都不能打开fifo。

您可以在strace下运行程序来查看正在进行的操作。

答案 1 :(得分:1)

从手册页:

  

打开FIFO以便正常读取   阻止直到某个其他进程打开   写入的FIFO相同,副   反之亦然。

  

进程可以打开FIFO   非阻塞模式。在这种情况下,   开放供阅读将成功   即使没有人在写作上打开   方面;开放只写会   ENXIO失败(没有这样的设备或   地址)除非另一端有   已经被打开了。

     

在Linux下,打开FIFO进行读取   而写作将会成功   阻塞和非阻塞模式。 POSIX   留下这种行为未定义。这个   可用于打开FIFO进行写入   虽然没有读者可用。   一个使用两端的进程   连接以便沟通   与自己一起应该非常小心   避免死锁。