Как мне синхронизировать родительские и дочерние процессы, используя каналы?

0

Я считаю, что есть способ синхронизировать два процесса с помощью труб, но я не уверен, как его реализовать. В моем коде оба процесса child и father выполняют свой код одновременно, я хотел бы, чтобы один процесс ждал другого. Например, используя канал для блокирования одного процесса, пока не будет выполнен другой процесс.

Мой код:

int main()
{

int one[2];
int two[2];
int x=0;
char messageRead[256], messageRead2[256], messageWrite[256], messageWrite2[256];

pipe(one);
pipe(two);

pid_t pid = fork();

if(pid == 0)  //child process
{

while (x==0)   //loop until condition is met (didn't write the condition yet, just testing)
{
std::cout << "Child process.\n\n";
std::cin >> messageWrite;
write(one[1], messageWrite, 256);
read(two[0], messageRead2, 256 );
}
}

else if(pid>0)  //father process
{
while(x==0)
{
std::cout << "Father process.\n\n";
std::cin >> messageWrite;
write(two[1], messageWrite2, 256);
read(one[0], messageRead, 256);
}
}
}

Прямо сейчас, оба процесса идут туда и обратно, как я хочу, но оба они выполняются одновременно:

Father process.

Child process.

user input here
user input here
Father process.

Child process.
user input here
user input here
Child process.

Father process.
user input here
user input here

etc...
  • 0
    Вы можете рассмотреть возможность использования мультиплексного системного вызова, например poll (2), и вам следует прочитать Advanced Linux Programming
Теги:
process
fork

1 ответ

2
Лучший ответ

Один метод, который может работать достаточно хорошо, - это просто полагаться на блокирование каналов, если вы пытаетесь прочитать, и в них нет ничего. При этом (если необходимо, при необходимости) вы определяете один процесс для владения ресурсом, который вы защищаете, и пока он продолжает владеть этим ресурсом, он использует его по своему усмотрению (и пустой канал).

Когда владелец ресурса хочет отказаться от ресурса, он записывает токен в трубку. Этот токен может быть любым, что имеет для вас смысл... простой бессмысленный фрагмент данных или что-то, что имеет смысл.

Когда любой процесс хочет владеть ресурсом (пока он еще не был), он читает канал... это блокирует его, пока что-то там не будет. Когда чтение будет успешным, этот процесс теперь владеет ресурсом.

Вы можете сделать это с помощью неблокирующего ввода-вывода, если вы сохраняете отслеживание в каждом процессе, если у вас есть ресурс или нет.

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

  • 0
    Спасибо, это то, что я подумал, что означает, что я был по крайней мере на правильном пути. Я постараюсь сделать это сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню