2017-04-20 2 views
0

부모 프로세스와 1 명의 자녀가 프로세스 통신을하고 있습니다. 내가하고 싶은 것은 자식이 부모에게 보낸 모든 메시지가 그것을 읽는다는 것입니다. (일종의 차단 보내기, 부모는 자식이 다른 메시지를 계속 보내기 전에 먼저 메시지를 읽어야합니다). 나는 파이프를 사용할 수 없다. 나는 Silberschatz 책에 대한 글을 읽었지만, 좋은 예를 발견하지 못했다. 어떤 도움이 좋을 것입니다!부모와 자녀 사이의 IPC.

int main(int argc, char** argv) { 
printf("This process: "); 
printf("%d\n",getpid()); 
printf("Parent: "); 
printf("%d\n",getppid()); 
pid_t f; 
int input; 
f = fork(); 
if (f == 0) { 
    for(int i=0;i<5;i++){ 
     printf("Input a number: "); 
     scanf("%d",&input); 
     send(getppid(),input); 
    } 
    printf("\n"); 
    exit(0); 
} else { 
recv(f,input); 
printf("%d",input); 
} 
wait(); 
exit(0); 

}

+0

이것은 무엇입니까? 그것은 무엇을합니까? 그것은 (당신이 그것을 기대했던) 무엇을하지 않습니까? – KevinDTimm

+0

나는 child-> parents에 숫자를 입력하고 child-> parent 읽기에 다시 input을 입력한다. 방금 5 개의 숫자로 된 간단한 케이스를 만들었습니다. – BlackFolgore

+1

'send'는 문제의 해결책이 아니며, 소켓 파일 편집기 인 것처럼 pid에서 호출 할 수는 없습니다. – PSkocik

답변

0

이 끔찍한 해킹지만 작동이 :/ 당신은 세마포어를 사용해야하거나 공유 메모리에 신호의 일종 이 코드의 조각이다. ftok (createthisfile.txt)에 대한 파일을 만듭니다. 공유 메모리 블록에 집중적으로 폴링을 수행하고 "for"(int = 99)를 사용하여 자식 for 루프가 완료되었음을 나타냅니다. 99는 번호로 사용할 수 없으며 부모는 조기에 퇴장합니다. 마지막으로, 당신은 이것을 공부하고 나서 스스로 문제를 해결하고 팁과 힌트를 얻지 만 다른 사람들이 당신을 위해 일하도록 내버려 두지 않아야합니다 : 그렇지 않으면 컴퓨터 과학이 아닌 stackoverflow를 전공 할 것입니다 :) 그것은 빠른 운동이지만 게시하는 것을 유감스럽게 생각합니다./

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <sys/types.h> 

int main(int argc, char** argv) { 
    key_t k; 
    pid_t f; 
    int shmid; 
    int input; 

    printf("This process: "); 
    printf("%d\n",getpid()); 
    printf("Parent: "); 
    printf("%d\n",getppid()); 

    k = ftok ("createthisfile.txt", 'R'); 
    shmid = shmget(k, sizeof(int), IPC_CREAT|SHM_R|SHM_W); 
    char *addr = shmat(shmid,0,0); 

    f = fork(); 

    if (f == -1) { 
     exit(1); 
    } 

    if (f == 0) { 
     for(int i=0;i<5;i++){ 
     printf("Input a number: "); 
     scanf("%d",&input); 
     memcpy(addr, &input, sizeof(int)); 
     } 
     input = 99; 
     memcpy(addr, &input, sizeof(int)); 
     printf("\n"); 
     exit(0); 
    } else { 
     while (1) { 
     memcpy(&input, addr, sizeof(int)); 
     if (input != 0) { 
      if (input == 99) { 
       exit (0); 
      } 
      printf("[Parent reads: %d]\n",input); 
      input = 0; 
      memcpy(addr, &input, sizeof(int)); 
     } 
     } 
    } 

    exit(0); 
} 
+0

아주 좋습니다! 나는 벌써 (2 분 전에) 일하는 사람도 얻었다! 너의 것을 확인할거야!. – BlackFolgore

+0

니스, 축하해. 솔루션을 찾으면 정말 행복합니다. –

+0

메시지 대기열과 같이 만들었습니다. http://www.chuidiang.org/clinux/ipcs/cola1.c – BlackFolgore