LINUX.ORG.RU

Вопрос по FIFO


0

3

Доброго времени суток. С-но вопрос, делаю простейший вывод в FIFO

char fifoName[]="testfifo"; //имя файла FIFO

void write_FIFO()
{

  unlink(fifoName);

  FILE *cfp;

   int ret;

  ret = mknod(fifoName, S_IFIFO | 0600, 0); 


        cfp = fopen(fifoName,"w");
      //if(cfp == NULL) 
      //fprintf(stderr, "ERROR: Ошибка работы с FIFO\n" );

        int value=1000;

      int rt=fprintf(cfp,"%d\n",value);
      printf("write %d from child on fifo \n", value);
      value=2000;
      fprintf(cfp,"%d",value);
      printf("write %d \n", value);
      //fflush(cfp);
      exit(0);

}
void read_FIFO()
{
  FILE *pfp;
        pfp = fopen(fifoName,"r");
      if(pfp == NULL) 
  
  fprintf(stderr, "ERROR:\tОшибка работы с FIFO\n" );

    int result;
    int value;
      while(result=fscanf(pfp,"%d",&value)>0)
      {
          printf("This is the parent. Received value %d from child on fifo \n", value);
      }
      if(result < 0) 
  fprintf(stderr, "ERROR:\t ошибка работы с FIFO\n" );
      fclose(pfp);

}

 
int main()
{    
    pid_t pid, pid2;
   
    pid=fork();

    printf("pid=%d\n", pid);
    switch(pid)
    {
        case 0:

        pid2=fork();
        switch(pid2)
        {
            case 0:
            write_FIFO();
            break;

            default:
            //waitpid(pid2,0,0);
            read_FIFO();
           unlink(fifoName); /* Delete the created fifo */

            break;
        }

        break;

        default:
        waitpid(pid,0,0);
      exit(0);
       break;
    }
   
}

Этот пример работает, проблема начинается, если я пытаюсь раскомментировать строку waitpid(pid2,0,0) - тогда чтение зависает. Дело в том, что в моей программе нужно реализовать ожидание процесса, а как только я делаю это, программа сразу зависает на чтении. Подскажите пожалуйста, почему это происходит и куда копать?



Последнее исправление: gwyllum (всего исправлений: 1)

man 7 pipe.

anonymous
()
Ответ на: комментарий от anonymous

Классическая блокировка на записи в полный пайп.

По-моему, там другая классическая ошибка, но смотреть внимательно на такой код мне влом.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Спасибо за ответ. Извините за ламерский вопрос, а почему без waitpit тогда все нормально записывает и читает? Можно поподробнее чуть-чуть про indent?

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

Спасибо за ответ

?

почему без waitpit тогда все нормально записывает и читает?

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

Можно поподробнее чуть-чуть про indent?

http://www.gnu.org/software/indent/

tailgunner ★★★★★
()

Дело в том, что в моей программе нужно реализовать ожидание процесса, а как только я делаю это, программа сразу зависает на чтении. Подскажите пожалуйста, почему это происходит и куда копать?

на вопрос «почему» тебе уже ответили, а что касается вопроса «что делать?», то рискну предложить отказаться от пайпов. Есть ещё сигналы, они не блокируются. А пайпы нужны для передачи данных.

emulek
()
Ответ на: комментарий от tailgunner

Спасибо, я ознакомился со ссылкой, но к сожалению не подходит. По условию задания необходимо использовать только форк, waitpid и средства коммуникации-синхронизации - pipe, FIFO, семафоры и т.п. Подскажите пожалуйста, задача в лоб никак не решается?

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

задача в лоб никак не решается?

С медным лбом никак.

anonymous
()
Ответ на: комментарий от gwyllum

Спасибо, я ознакомился со ссылкой, но к сожалению не подходит

Ты решил, что indent предназначен для решения твоей лабы? O_O

Подскажите пожалуйста, задача в лоб никак не решается?

В чем ошибка - я сказал. В чем заключается задача - ты не сказал.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Суть задачи - есть ветка процессов. Каждый процесс имеет свой свет. Например, зеленый порождает синий желтый красный. Синий порождает фиолетовый. Фиолетовый должен передать данные через FIFO желтому. Ну это если конкретно суть проблемы. А там так процессы должны обмениваться данными через pipe еще и т.п. Процессы должны запустившись выводить сообщения о запуске. Чтобы нормально выводился текст их сообщений, а не в разнобой, в некоторых местах я использую waitpid. Иначе получится типа

Процесс 1 создает процесс 2, но не успел он сообщить об этом, тут же управление передается процессу 3, который создает процесс 4 и сообщает об этом, в общем, каша.

С передачей данных через pipe программа работает отлично. А вот с FIFO возникают вышеописанные проблемы.

gwyllum
() автор топика

У тебя один процесс начинает писать в канал и блокируется. Блокируется потому, что на том конце канал никто даже не открыл. Открыть должен был бы второй процесс, но тот ждёт окончания работы первого процесса, который, как мы выяснили, заблокирован. Получаем замкнутый круг.

anonymous
()

Может тебе уже книжку какую-нибудь по теме начать читать? А то ЛОР потом отберёт и поделит твоё свидетельство о впустую прослушанных курсах.

mashina ★★★★★
()
Ответ на: комментарий от gwyllum

Тебе уже сказали всё, что нужно для решения этой задачи.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.