Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: поведение mknod()
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
romez777
Приветствую.

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

Ничего не виснет, корректно выходит.
romez777
Цитата(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() ?
Daniil
Цитата(romez777 @ Jul 19 2005, 12:01)
Может быть все дело в  том, что я не удалял ФИФО файл вызовом unlink() ?
*

Не должно. При повторном запуске mknod просто должна выдавать ошибку, говоря что файл уже существует.
Кстати, а какая ОС?
А если закоменировать mknod то не виснет?
romez777
Цитата(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
Daniil
Ну тогда все правильно. В случае открытия файла фифо без флага O_NONBLOCK так и будет, до тех пор пока в пайп не будет записано что-то.
Если напишем так
Код
readfd = open(FIFO, O_RDONLY | O_NONBLOCK);

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

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

Действительно, большое спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.