2014-05-15 5 views
0

두 프로세스를 파이프를 통해 통신하고 숫자를 번갈아 빼는 데 어려움이 있습니다. process1 :두 프로세스가 파이프를 사용하여 숫자를 빼기

출력 같아야 9 process2 : 8 process1 :에서 있어 : 출력 파크

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main() { 
    int p2c[2]; 
    int c2p[2]; 
    int n = 9; 

    pipe(p2c); 
    pipe(c2p); 

    write(p2c[1], &n, sizeof(int)); 

    if(fork() == 0) { 
     read(p2c[0], &n, sizeof(int)); 
     printf("Got from parent: %d", n); 
    n--; 
    write(c2p[1], &n, sizeof(int)); 
    close(p2c[0]); 
    close(p2c[1]); 
    close(c2p[0]); 
    close(c2p[1]); 
    exit(0); 
} 
else{ 
    read(c2p[0], &n, sizeof(int)); 
    printf("Got from child: %d", n); 
    n--; 
    write(p2c[1], &n; sizeof(int)); 
    close(p2c[0]); 
    close(p2c[1]); 
    close(c2p[0]); 
    close(c2p[1]); 

} 
return 0; 
} 

: 내가 지금까지했던 적이 무엇 7 ...

부모 : 9 소아과 수 ​​: 8 이 두 프로세스를 얻는 적절한 방법은 0까지 숫자를 빼는 것입니까? "8 : 아이 9있어 부모로부터 알았어"그 결과로, 당신은 필요, 당신은 모두 아이에 대한 루프 동안 또는 필요

답변

1

그것은 당신 만 받고있어 의미가 있습니다 및 부모 과정은 당신이 기대하는 것을 얻을, 그리고 그 루프의 정지 조건은 (N < 0)N 또는 파이프의 쓰기 끝을 감소시키는 후에도 닫히지 있습니다

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int main() { 
    int p2c[2]; 
    int c2p[2]; 
    int n = 9; 

    pipe(p2c); 
    pipe(c2p); 

    // this is important to prevent deadlock situation, at least one of both processes 
    // must start a write operation before while loop, unless the read will block and 
    // and each process still waiting the other to write something on the pipe 
    write(p2c[1], &n, sizeof(int)); 

    if(fork() == 0) { 
     int readStatus; 
     while(1){ 
      readStatus=read(p2c[0], &n, sizeof(int)); 
      // when read returns 0, this means the write end of pipe was closed, so we have to break the loop 
      // because no more data to recieve 
      if(readStatus == 0) break; 
      printf("Got from parent: %d\n", n); 
      n--; 
      // we check if n less than 0, if yes we are finished 
      if(n < 0) break; 
      write(c2p[1], &n, sizeof(int)); 
     } 
     close(p2c[0]); 
     close(p2c[1]); 
     close(c2p[0]); 
     close(c2p[1]); 
     exit(0); 
    } 
    else{ 
     int readStatus; 
     while(1){ 
      readStatus= read(c2p[0], &n, sizeof(int)); 
      if(readStatus == 0) break; 
      printf("Got from child: %d\n", n); 
      n--; 
      if(n < 0) break; 
      write(p2c[1], &n, sizeof(int)); 
     } 

     close(p2c[0]); 
     close(p2c[1]); 
     close(c2p[0]); 
     close(c2p[1]); 

    } 
    return 0; 
} 
+0

이것은 완벽합니다. 내가 게시 한 것은 단지 읽기 및 쓰기 뿐이므로 출력이 논리적임을 이해합니다. 그러나 나는 그 생각을 잠시 동안했으나 다음과 같이 보였다 : 부모로부터 받음 : 9 부모로부터 받음 : 8 ... 아이에게서 받음 : 8 아이에게서 받음 : 7 ... 그리고 나 내 문제가 클로저 처리에 있다고 생각해보십시오. 이것은 완벽합니다, 고마워요! – user3642381