【问题标题】:How do I synchronize father and child processes using pipes?如何使用管道同步父进程和子进程?
【发布时间】:2013-11-22 16:29:41
【问题描述】:

我相信有一种方法可以使用管道同步两个进程,但我不确定如何实现它。在我的代码中,子进程和父进程同时执行其代码,我希望一个进程等待另一个进程。例如,使用管道阻塞一个进程,直到另一个进程完成。

我的代码:

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...

【问题讨论】:

标签: c++ linux unix process fork


【解决方案1】:

如果您尝试读取并且其中没有任何内容,则可以简单地依赖管道阻塞的一种方法可以很好地工作。有了它(如有必要进行配置),您定义一个进程来拥有您正在保护的资源,并且在它继续拥有该资源的同时,它会按照自己的意愿使用它(并且管道是空的)。

当资源所有者希望放弃资源时,它会将令牌写入管道。这个标记可以是任何对你有意义的东西……一段简单的无意义的数据,或者是有意义的东西。

当任何一个进程希望拥有资源时(虽然它还没有),它会读取管道……这会阻塞它,直到那里有东西。当读取成功时,该进程现在拥有该资源。

您也可以使用非阻塞 I/O 来执行此操作,只要您在每个进程中跟踪您是否拥有资源。

您在问题中提供的代码中的问题是两个进程都立即写入对方的管道,从而使另一端的读取成功而没有任何延迟。

【讨论】:

  • 谢谢,我就是这么想的,这意味着我至少走在了正确的轨道上。我现在就努力让它工作。
猜你喜欢
  • 2012-03-04
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2019-06-17
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
相关资源
最近更新 更多