2013-11-22 3 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)과 같이 멀티플렉싱 시스템 콜을 사용하는 것을 고려해 볼 수 있으며 [Advanced Linux Programming] http://advancedlinuxprogramming.com/ –

답변

2

한 가지 방법을 오히려 잘 읽는 것을 시도하고 그들 안에 아무 것도없는 경우에 파이프 차단에 의존하는 것입니다. 필요한 경우 구성하여 보호하고있는 자원을 소유하는 하나의 프로세스를 정의하고이 자원을 계속 보유하면서 원하는대로 사용합니다 (파이프는 비어 있음).

리소스 소유자가 리소스를 포기하고자 할 때 파이프에 토큰을 씁니다. 이 토큰은 당신에게 의미있는 모든 것, 즉 의미가없는 단순한 데이터 또는 의미가있는 것일 수 있습니다.

두 프로세스 중 하나가 리소스를 소유하고 싶어하는 경우 (아직없는 경우) 파이프를 읽습니다.이 프로세스는 리소스가있을 때까지 차단합니다. 읽기가 성공하면 해당 프로세스가 이제 자원을 소유합니다.

자원을 소유하고있는 경우 각 프로세스를 추적하는 한 비 차단 I/O에서도이 작업을 수행 할 수 있습니다.

질문에서 제공 한 코드의 문제는 두 프로세스가 상대방의 파이프에 바로 쓰기 때문에 상대방의 읽기가 지연없이 성공할 수 있습니다.

+0

고마워, 그게 내가 적어도 올바른 길을 가고 있었다는 것을 의미한다고 생각한 것이다. 나는 지금 그것을 작동하게하려고 노력할 것이다. – Exn

관련 문제