|
поведение mknod() |
|
|
|
Jul 18 2005, 11:41
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Приветствую. Создал именованный канал, открыл на чтение, запускаю код. Программа висит и как будто ждет чего-то  Это нормальное поведение и в FIFO нужно действительно что-то лить? Код примитивный: Код ...
int main(void) {
if ( mknod(FIFO, S_IFIFO|0666, 0) == -1 ) { perror("pipe() error"); exit(1); }
printf("mknod() succedded\n"); // эта строка выводится на экран, после чего помогает только Ctrl+C return 0; }
|
|
|
|
|
 |
Ответов
|
Jul 19 2005, 01:51
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Цитата(romez777 @ Jul 18 2005, 18:41) Приветствую. Создал именованный канал, открыл на чтение, запускаю код. Программа висит и как будто ждет чего-то  Это нормальное поведение и в FIFO нужно действительно что-то лить? Странно... Все должно работать Код #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <unistd.h> #include <linux/stat.h>
#define FIFO_FILE "TESTFIFO"
int main(void) { umask(0); if(mknod(FIFO_FILE, S_IFIFO | 0666, 0) == -1) { perror("mknod()"); exit(1); } unlink(FIFO_FILE); printf("Done\n"); return (0); } Ничего не виснет, корректно выходит.
|
|
|
|
|
Jul 19 2005, 05:01
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Цитата(Daniil @ Jul 19 2005, 04:51) Странно... Все должно работать Код #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <unistd.h> #include <linux/stat.h>
#define FIFO_FILE "TESTFIFO"
int main(void) { umask(0); if(mknod(FIFO_FILE, S_IFIFO | 0666, 0) == -1) { perror("mknod()"); exit(1); } unlink(FIFO_FILE); printf("Done\n"); return (0); } Ничего не виснет, корректно выходит. Может быть все дело в том, что я не удалял ФИФО файл вызовом unlink() ?
|
|
|
|
|
Jul 19 2005, 05:29
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Цитата(romez777 @ Jul 19 2005, 12:01) Может быть все дело в том, что я не удалял ФИФО файл вызовом unlink() ? Не должно. При повторном запуске mknod просто должна выдавать ошибку, говоря что файл уже существует. Кстати, а какая ОС? А если закоменировать mknod то не виснет?
Сообщение отредактировал Daniil - Jul 19 2005, 05:31
|
|
|
|
|
Jul 19 2005, 07:25
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Цитата(Daniil @ Jul 19 2005, 08:29) Не должно. При повторном запуске mknod просто должна выдавать ошибку, говоря что файл уже существует. Кстати, а какая ОС? А если закоменировать mknod то не виснет? Пардон, я слегка ошибся с кодом. Вызов mknod() отрабатывается нормально, а вот open() на созданный файл приводит к зависанию: Код int main(void) { int readfd, n; char buf[80];
if ( mknod(FIFO, S_IFIFO|0666, 0) == -1 ) { perror("pipe() error"); exit(1); }
if ( (readfd = open(FIFO, O_RDONLY)) < 0 ) { perror("open() error"); exit(1); } // вот здесь висим ... linux, ядро 2.4.20, glibc-2.3.2
|
|
|
|
|
Jul 19 2005, 08:41
|
Частый гость
 
Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590

|
Ну тогда все правильно. В случае открытия файла фифо без флага O_NONBLOCK так и будет, до тех пор пока в пайп не будет записано что-то. Если напишем так Код readfd = open(FIFO, O_RDONLY | O_NONBLOCK); то тогда open должна пролетать без проблем.
|
|
|
|
|
Jul 19 2005, 09:41
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Цитата(Daniil @ Jul 19 2005, 11:41) Ну тогда все правильно. В случае открытия файла фифо без флага O_NONBLOCK так и будет, до тех пор пока в пайп не будет записано что-то. Если напишем так Код readfd = open(FIFO, O_RDONLY | O_NONBLOCK); то тогда open должна пролетать без проблем. Действительно, большое спасибо!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|