FIFO в C (именованные каналы)
Я получаю ошибки разрешения при попытке 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);
}
}
2 ответа
Вы создаете это с 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
Если вы полагаетесь на вывод perror, чтобы сообщить, что получаете ошибки разрешения, вы, вероятно, ошибаетесь. Скорее всего, вызов printf изменится на ошибочный, поэтому информация ложная. Не звоните в printf. Просто пиши:
perror( path );
и посмотрите, изменятся ли сообщения об ошибках.