2017-01-27 5 views
-2

공유 메모리와 fork() 부모와 자식 프로세스의 계승을 계산하고 싶습니다. 내 문제는 자식 프로세스가 작동하지 않는 것 같습니다. 부모로부터 숫자를주고 싶습니다. 아이에게 그리고 아이가 계승의 결과를 부모에게 전달한 후에. 그러나 그 결과는 내가 제시 한 숫자와 동일합니다.부모와 자식 프로세스와 메모리를 공유하는 방법

나는 각 프로세스에 변수를 전달하기 위해 snprintf() 또는 spritnf() 또는 itoa()atoi()를 사용하도록 요청 받았다.

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




int main(int argc , char *argv[]) 
{ 
    int shmid,fid,status,x; 
    char *shm; 
    char *s; 
    int i,y,c; 

    key_t key=1990; 
    //create shared memory 
    shmid=shmget(1990,300,IPC_CREAT|0666); 
    fid=fork(); 
    shm=shmat(shmid,NULL,0); 

    if(fid>0)//parent process 
    { 
     wait(&status); 
     s=shm; 
     printf("enter a number:"); 
     scanf("%d",&x); 
     sprintf(s,"%d",x);//convert int to string 
     printf("factorial of number:%d is:%s\n",x,s);//result 
     shmdt(shm); 
     shmctl(shmid,IPC_RMID,0); 

    }else if(fid==0)//child process 
    { 
     shm=shmat(shmid,NULL,0); 
     c=atoi(s);//conver string to int 
     // calculate factorial 
     for(i=1;i<=c;i++) 
     { 
      y *=i; 
     } 
     return y; 
     sprintf(s,"%d",y); 
     shmdt(shm); 

    } 
    return 0; 
} 
+1

부모는 자녀가 계산을 마칠 때까지 기다리지 않습니다. – mch

+0

's'은 자식의 공유 메모리를 가리 키지 않습니다. –

답변

2

당신은이 : 부모 프로세스가 수행

if(fid>0)//parent process 
{ 
    wait(&status); 

우선 아이가 죽을 때까지 기다릴 것입니다

난 다음에 도달했다. 그런 다음에 만 계산에 대한 입력 값이어야하는 숫자를 묻습니다. 이것은 잘 작동하지 않을 것입니다.

숫자를 요청하고 공유 메모리에 기록하고 숫자가 준비되었다는 일부 (다른) IPC 메커니즘을 통해 자식에게 알리기 위해서는 부모가 필요합니다. 그 다음에 아이는 깨어나서 숫자를 읽고, 계산을하고, 답을 쓰고, 부모에게 알리려면 간단히 끝내야합니다. 한편, 부모는 이제 자식이 완료 될 때까지 기다린 다음 공유 메모리에서 응답을 읽습니다.

fork()에 전화하기 전에 내 코드는 shmat()이었습니다. 기록으로, 아이가 그것은 key_t key = 1990;을 만들 이상한

. 즉, 정통이 아니다. 두 번 (한 번에 단지 한 번 else if (fid == 0) 코드에서 fork()shmat()를 사용하고 그것을 사용하지. 나는 statusx가있는 표시되지 않습니다 하여 사용할.

를 계승을 계산하는 방법으로, 이는 터무니. IPC에서 운동 및 프로세스 간 동기화 된 바와 같이,이 좋은 간단한 예이다.

, 32 비트 정수 수있는 유일한 값을 저장하는 기억 최대 12 개! 64 비트 정수는 최대 20 개까지 저장할 수 있습니다! e 계승표를 만들거나 즉석에서 계산하십시오. 또는 부동 소수점 산술을 사용해야합니다. 자신의 범위를 벗어나는 데는 어느 정도 시간이 걸립니다 (어딘가에 200 미만!, IIRC).