2009-02-28 6 views
0

모든 변수가 이전에 선언되었다고 가정합니다. 자식 프로세스는 그것이 실행되지 않는다고 생각하게하는 어떤 것도 출력하지 않습니다. 부모 프로세스는 공유 메모리를 얻지는 못했지만 제대로 실행됩니다. 제가 ... 코드의 길이 죄송여기에서 하위 프로세스가 아무 것도 인쇄하지 않는 이유는 무엇입니까?

// create 5 child process 
for(int k=0;k<5;k++){ 

    // fork a child process 
    pid = fork(); 

    // error occured on fork 
    if (pid < 0) { 
     fprintf(stderr, "Fork Failed"); 
     return 1; 
    } 
    // this is what the child process will run 
    else if (pid == 0) { 
     //create a shared mem segment 
     segment_id = shmget(IPC_PRIVATE, size, S_IRUSR | S_IWUSR); 

     //attach the shared memory segment 
     shared_memory = (char *) shmat(segment_id, NULL, 0); 

     printf("this is child"); 

     double x = 0; 
     double sum = 0; 

     // Run process that sums the function 
     for(int i=0; i<n; i++){ 
      // get random number in range of x1-x2 
      x = rand()%(x2 - x1 + 1) + x1; 
      sum = sum + f(x); 
     } 

     //write output to the shared memory segment 
     sprintf(shared_memory, "%f", sum); 
     execlp("/bin/ls", "ls", NULL); 

    } 

    // this is what the parent process will run 
    else { 

     //print output from shared memory 
     printf("\n*%s", shared_memory); 

     //detach shared memory 
     shmdt(shared_memory); 

     //Here we add the shared memory to the array 
     // To add together at the end 
     // but since I cant get the memory to share 
     // the array can't be implemented 

     //remove the shared memory segment 
     shmctl(segment_id, IPC_RMID, NULL); 

     wait(NULL); 
    } 
} // End of for statement 
+0

shm * 작업에 대한 오류 조건을 확인하지 않습니다. –

답변

10

는 C 표준 출력 스트림은 내부적으로 데이터를 버퍼링한다. "this is child"메시지가 버퍼링되고 execlp에 의해 버퍼가 플러시되지 않으므로 사라집니다. fflush (stdout)를 시도하십시오. printf 후. 부수적으로, fork() 전에이 작업을 수행해야하므로 자식과 부모가 모두 fork 이전에 버퍼링 된 출력을 쓰려고하지는 않습니다.

+0

인쇄 된 출력에 개행 문자가 포함되지 않기 때문에 이중으로 문제가 발생할 가능성이 높습니다. 출력이 라인 버퍼링 되었다면, 개행은 데이터를 강제로 나타냅니다. –

+0

또한 이것은 진단을 stderr로 인쇄하는 좋은 이유입니다. 버퍼되지 않고 쉽게 손실되지 않습니다. –

+0

나는 이것을 시도했지만 그것은 나를 위해 작동하지 않습니다. 나는'fflush (stdout);을 사용했으나 아직 자식 프로세스는 아무 것도 출력하지 않습니다. 우리는 현재 "현재 실행중인 (현재 자식 또는 부모 프로세서가 제공하고있는) 현재" – Merom

-1

먼저 모든 공유 메모리를 제거하고 하위 프로세스가 printf를 성공적으로 수행 할 수 있는지 확인하십시오.

스 니펫의 모양에 따라 부모 프로세스에서는 공유 프로세스가 아니라 shared_memory가 초기화됩니다.

3

stderr에 인쇄하십시오. 버퍼링되지 않습니다.

fprintf(stderr,"Plop\n"); 

또한 공유 메모리 물건 (SEGMENT_ID, shared_memory)의 상위에서 초기화되지 않은 (또는 다음의 경우는 하위 동일하지 않다).

또한 자식 프로세스가 여전히 처리되는 동안 부모 프로세스는 공유 메모리를 손상시킬 수 있습니다. 부모는 먼저 자녀가 생성 한 데이터를 처리 한 다음 처리해야합니다.