2012-10-30 110 views
1

当在当前目录中尝试mkfifo()时,出现许可错误。我绝对有权在这里创建文件。任何想法可能是什么问题?C中的FIFO(命名管道)

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); 
    } 
} 
+0

“无法创建fifo”看起来像一个错误消息。因此,它属于'stderr'。简单地写'perror(path)'会更好;'你的printf可能正在改变'errno',所以你对perror的调用给你提供了不好的信息。 –

+0

您是否检查过“errno”设置为? – squiguy

+0

删除printf,什么perror()打印? – pedr0

回答

1

如果您依赖于perror的输出来告诉您,您正在获得权限错误,则可能是错误的。对printf的调用很可能会改变errno,所以信息是虚假的。不要打电话给printf。只需编写:

perror(path); 

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

+0

现在我得到“无效的参数”。但是这两个参数都是有效的? –

4

您正在使用oflag而非mode_t来创建它。

mkfifo需要mode_t

类型的第二参数换句话说类似:0666。你试图在fcntl.h定义给它一个oflag,这通常是这样的:

#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