【问题标题】:Problem with opening a named pipe打开命名管道的问题
【发布时间】:2011-04-17 19:16:13
【问题描述】:

我在尝试通过管道发送数据时遇到了一个问题,更准确地说:我没有得到管道的非空文件描述符。 下面是创建管道的代码:

//PIPE is defined as a "/tmp/my.fifo"
umask(0);
...
mknod(PIPE,S_IFIFO,0);
...
p=fopen(PIPE,"w");
if (p)
{
    //fprintf(p,"some message");
    fclose(p);
}
else
    printf("Could not open the pipe\n");

这是从管道读取的代码:

cos_pipe = fopen(PIPE,"r");
if (cos_pipe)
{
    fgets(buffer,80,cos_pipe);
    ...
    fclose(cos_pipe);
}
else
{
    printf("Couldn't open the pipe\n");
    usleep(300000);
}

代码被编译成两个不同的二进制文件,我分别启动它们。我得到的所有输出都是“无法打开管道”。

关于一些相关的说明:创建管道的程序是否应该稍后删除它?

【问题讨论】:

  • 为什么不用mkfifo 而不是mknod
  • 检查 strerror(errno): 权限被拒绝

标签: c linux named-pipes


【解决方案1】:

mode 参数也需要权限。使用S_IFIFO|S_IRUSR|S_IWUSR

考虑改用mkfifo 函数:

mkfifo(PIPE,S_IRUSR|S_IWUSR)

您应该在使用完管道后将其移除。此外,如果您的程序有多个实例同时运行,会发生什么情况 - 您使用的是固定名称的管道。

【讨论】:

  • 每个程序都会为自己创建一个带有进程标识符的 .pid 文件,当它变成守护进程时会收到它。每个其他实例都会检查该文件是否存在,如果存在则不会继续。
  • 好吧,既然你的程序不是以 root 身份运行的(我怎么知道?因为如果是你就不会出现错误),如果两个用户想运行它怎么办?跨度>
  • 这就是我想要回答的问题。 ) 当我从 root 运行这两个程序时,数据成功通过
  • 您可能想在此处使用 UNIX 域套接字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多