C: создание именованного канала с помощью mknod() не работает

Язык: C ОС: Ubuntu

Я просто пытаюсь создать именованный канал FIFO с помощью команды:

state = mknod("pipe.txt", S_IFIFO | 0666, 0);

проблема в том, что я всегда получаю значение состояния -1 (что означает, что оно не удалось) вместо 0.

perror возвращает "pipe.txt: файл существует"

я понятия не имею, как я должен отладить такую ​​проблему или в чем может быть причина, надеюсь, кто-нибудь код направит меня, что не так.

(примечание: файл pipe.txt существует по тому же пути, что и исходный файл.)

2 ответа

Решение

Чтение: int mknod (const char * path, mode_t mode, rdev_t dev_identifier);
Общее описание:
Создает новый символьный специальный файл или специальный файл FIFO (именованный канал) с именем пути, указанным в аргументе пути.

Если файл уже существует, произойдет сбой с ошибкой: File exists

Чтобы избежать этой ошибки, удалите (unlink()) файл, как я делаю в моем коде ниже (читай комментарий):

int main() {
  char* file="pipe.txt";
  unlink(file);  // Add before mknod()
  int state = mknod(file, S_IFIFO | 0666, 0);
  if(state < 0){
    perror("mknod() error");
  }
  return 0;
}

Вы должны изучить errno чтобы увидеть, что это за ошибка, но это, вероятно, EEXIST так как я считаю, что это то, что происходит, если файл уже существует.

Из документации по Linux дляmknod:

Если путь уже существует или является символической ссылкой, этот вызов завершится ошибкой EEXIST.

Однако, если файл уже существует и является каналом, созданным вами ранее, вы можете безопасно открыть его снова. Все mknod (и его часто предпочитаемый кузен, mkfifo) фактически создает FIFO, вам все равно придется открыть его на обоих концах, чтобы обеспечить передачу данных.

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