Mac OS блокирует чтение (POSIX)

#macos #posix #blocking

#macos #posix #блокировка

Вопрос:

Я пытаюсь организовать передачу блокировки между родительским и дочерним элементами, обрабатываемыми с использованием классической схемы fork() / pipe() , но я не могу понять, почему блокируется только первое чтение () в дочернем элементе, а все последующие чтения — нет, и, кроме того, они возвращают не нулевой результат после чтения!

например:

родитель, сначала запишите имя файла дочернему, чем ждать ответа:

 for (NSString* file in filenames) { 

        fprintf(pict_log, "send to conversion file %sn", filename);
        write(g_pfds[1], filename, 512);
        memset(filename, ' ', 512);
        read(g_pfds[0], filename, 512);
        fprintf(pict_log, "completed for file: %sn", filename);
}
 

дочерний элемент, то же самое, но наоборот.

 while(!g_break_child) 
{
            memset(filename, ' ', 512);
            int read_bytes = read(g_pfds[0], filename, 512);
            // some processing...
            write(g_pfds[1], filename, 512);
        }
 

Я должен быть заблокирован при чтении дочернего элемента () после каждой итерации, но почему этого не происходит?

Ответ №1:

Теперь я мог бы ответить себе, проблема в том, что в моем случае мне нужна двунаправленная передача, но когда мы открываем пару дескрипторов через функцию pipe() , мы, таким образом, создаем однонаправленный канал, в случае двунаправленной передачи нам нужно дважды вызвать pipe(), чтобы создать два однонаправленных канала!