【问题标题】:Using named pipes in a single process在单个进程中使用命名管道
【发布时间】:2011-01-16 03:22:09
【问题描述】:

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

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

我想要的是让 main 阻塞,直到将某些内容写入管道。 问题是信号处理程序 sigint() 在打开管道后也会阻塞。考虑到管道已经在 main() 中打开以供读取,这应该发生吗?

【问题讨论】:

    标签: c ipc named-pipes


    【解决方案1】:

    来自手册页:

    打开一个FIFO正常读取 阻塞,直到其他进程打开 相同的 FIFO 用于写入,反之亦然 反之亦然。

    和:

    一个进程可以在 非阻塞模式。在这种情况下, 打开只读将成功 即使没有人在写入时打开 一边还;只写会打开 ENXIO 失败(没有这样的设备或 地址),除非另一端有 已经打开了。

    Linux下,打开一个FIFO进行读取 和 write 都会成功 阻塞和非阻塞模式。 POSIX 未定义此行为。这 可用于打开 FIFO 进行写入 虽然没有可用的阅读器。 使用两端的进程 连接以便通信 与本身应该非常小心 避免死锁。

    【讨论】:

      【解决方案2】:

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

      并打开一个 fifo 用于写入块,直到有人打开它进行读取。

      信号处理程序与您的 main() 在同一线程中运行,因此您会遇到死锁。两者都无法打开先进先出。

      您可以通过在strace 下运行您的程序来检查发生了什么。

      【讨论】:

      • 这是在正确的轨道上 - 只是扩展“在同一线程中运行”部分,SIGINT 导致 O_RDONLYopen 失败(“中断的系统调用”) ,然后然后执行信号处理程序(在open调用返回之前)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多