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, вам все равно придется открыть его на обоих концах, чтобы обеспечить передачу данных.