【问题标题】:FIFOs in C (Named-pipes)C 中的 FIFO(命名管道)
【发布时间】:2012-10-30 16:15:10
【问题描述】:

我在当前目录中尝试mkfifo() 时遇到权限错误。我绝对有权在这里创建文件。知道可能是什么问题吗?

char dir[FILENAME_MAX];
getcwd(dir, sizeof(dir));


for(i = 0; i<num_nodes; i++)
{
    char path[FILENAME_MAX];
    sprintf(path, "%s/%d",dir, i);
    printf("%s\n", path);
    fifoArray[i] = mkfifo(path, O_WRONLY);
    if(fifoArray[i] < 0)
    {
         printf("Couldn't create fifo\n");
         perror(NULL);
    }
}

【问题讨论】:

  • “无法创建先进先出”似乎是一条错误消息。因此,它属于stderr。最好直接写 perror( path ); 你的 printf 可能正在改变 errno,所以你对 perror 的调用是给你错误的信息。
  • 您检查过errno 的设置吗?
  • 去掉printf,perror()打印什么?
  • 文件系统是什么?
  • 似乎 mkfifo 的第二个参数不正确,请。将调用更改为 fifoArray[i] = mkfifo(path,S_IRWXU );

标签: c named-pipes fifo mkfifo


【解决方案1】:

您正在使用oflag 而不是mode_t 创建它。

mkfifo 采用mode_t 类型的第二个参数

换句话说,例如:0666。您正在尝试为它提供oflag 中定义的fcntl.h,这通常是这样的:

#define O_RDONLY             00
#define O_WRONLY             01
#define O_RDWR               02

因此,Invalid argument。以下是打开fifo的方法:

char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);

if((fd = open(myfifo, O_RDONLY | O_NONBLOCK)) < 0){
  printf("Couldn't open the FIFO for reading!\n");
  return 0;
}
else {
   //do stuff with the fifo

【讨论】:

    【解决方案2】:

    如果您依靠 perror 的输出来告诉您遇到了权限错误,那么您很可能弄错了。对 printf 的调用很可能会更改 errno,因此该信息是虚假的。不要调用 printf。随便写:

    perror( path );
    

    并查看错误消息是否更改。

    【讨论】:

      猜你喜欢
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多