如何使用管道同步父进程和子进程?

时间:2013-11-22 16:29:41

标签: c++ linux unix process fork

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

我的代码:

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

1 个答案:

答案 0 :(得分:2)

一种可以很好地工作的方法是,如果你试图阅读并且其中没有任何东西,只需依靠管道阻塞。使用它(在必要时配置),您可以定义一个进程来拥有您正在保护的资源,并且当它继续拥有此资源时,它会根据需要使用它(并且管道为空)。

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

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

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

您在问题中提供的代码中的问题是两个进程立即写入另一个进程,允许另一端的读取成功而没有任何延迟。