2013-11-22 41 views
0

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

我的代码:

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)](http://man7.org/linux/man-pages/man2/poll.2.html)等多路复用系统调用,您应该阅读[高级Linux编程]( http://advancedlinuxprogramming.com/) –

回答

2

一种方法,可以工作如果你尝试阅读并且没有任何内容,那么简单地依靠管道阻塞。通过这种方式(如果需要配置),您可以定义一个进程以拥有您正在保护的资源,并在它继续拥有此资源时,按照它的意愿使用它(管道是空的)。

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

当任一进程希望拥有该资源(虽然它尚未)时,它会读取管道......这会阻塞它,直到出现某种情况。当读取成功时,该过程现在拥有该资源。

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

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

+0

谢谢,这就是我认为这意味着我至少在正确的轨道上。我会尽力让它现在工作。 – Exn

相关问题