Блокировка чтения Mac OS (POSIX) - PullRequest
1 голос
/ 25 октября 2011

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

например:

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

for (NSString* file in filenames) { 

        fprintf(pict_log, "send to conversion file %s\n", filename);
        write(g_pfds[1], filename, 512);
        memset(filename, ' ', 512);
        read(g_pfds[0], filename, 512);
        fprintf(pict_log, "completed for file: %s\n", 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 Ответ

1 голос
/ 31 октября 2011

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

...