реклама на сайте
подробности

 
 
> поведение mknod()
romez777
сообщение Jul 18 2005, 11:41
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

Создал именованный канал, открыл на чтение, запускаю код. Программа висит и как будто ждет чего-то smile.gif
Это нормальное поведение и в 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;
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Daniil
сообщение Jul 19 2005, 01:51
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590



Цитата(romez777 @ Jul 18 2005, 18:41)
Приветствую.

Создал именованный канал, открыл на чтение, запускаю код. Программа висит и как будто ждет чего-то smile.gif
Это нормальное поведение и в 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);
}

Ничего не виснет, корректно выходит.
Go to the top of the page
 
+Quote Post
romez777
сообщение Jul 19 2005, 05:01
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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() ?
Go to the top of the page
 
+Quote Post
Daniil
сообщение Jul 19 2005, 05:29
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590



Цитата(romez777 @ Jul 19 2005, 12:01)
Может быть все дело в  том, что я не удалял ФИФО файл вызовом unlink() ?
*

Не должно. При повторном запуске mknod просто должна выдавать ошибку, говоря что файл уже существует.
Кстати, а какая ОС?
А если закоменировать mknod то не виснет?

Сообщение отредактировал Daniil - Jul 19 2005, 05:31
Go to the top of the page
 
+Quote Post
romez777
сообщение Jul 19 2005, 07:25
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Daniil
сообщение Jul 19 2005, 08:41
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 82
Регистрация: 3-09-04
Из: Russia, Novosibirsk
Пользователь №: 590



Ну тогда все правильно. В случае открытия файла фифо без флага O_NONBLOCK так и будет, до тех пор пока в пайп не будет записано что-то.
Если напишем так
Код
readfd = open(FIFO, O_RDONLY | O_NONBLOCK);

то тогда open должна пролетать без проблем.
Go to the top of the page
 
+Quote Post
romez777
сообщение Jul 19 2005, 09:41
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



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

то тогда open должна пролетать без проблем.
*

Действительно, большое спасибо!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 04:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016