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 );

и посмотрите, изменятся ли сообщения об ошибках.

Другие вопросы по тегам