2013-03-09 1 views
2

의 PID 반환 후 부모를 죽이고, 내 수술 시스템 클래스에 대한이 문제를 해결해야한다 :C 포크, 나는 C에 새로 온 사람과 나는 지난 2 주 포크에 대해 조사했습니다

"당신은 포크를 사용하여 "heavy weight"프로세스를 작성해야합니다. 그러면 첫 번째 프로세스는 상위 ID를 반환 할 때까지 대기해야하며 그 다음 상위 프로세스를 종료해야합니다. "

지시 사항은 다음과 같습니다. 꽤 혼란, 이것은 지금까지 내 코드입니다 (내가 말했듯이, 나는 C를 처음부터 연구했기 때문에 그냥 조사했습니다) 내 문제는 부모가 자식 프로세스가 그 id를 반환하기를 기다리지도 않는 것처럼 보입니다. 그 이후로 아이가 p를 죽이고 있기 때문에 arent, 그래서 나는 자식 프로세스를 만들고 있다고 생각한다. 그리고 실행될 때, 결국 부모를 죽이게하고, 부모에게 자식 실행을 기다리지 않게한다. (내가 생각하는 부분이 지침에 대해 혼란 스럽습니다.) 포크와 프로세스에 대해 더 알고 싶습니다. 뒤에있는 논리처럼 코딩 할 때 더 확신 할 수 있습니다. 감사합니다.

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


int main() { 
    pid_t idProceso; 
    int childState; 

    idProceso = fork(); 

    if (idProceso == 0){ 
     printf ("child id : %d. parent id %d\n", 
     getpid(), getppid()); 

      int parent = getppid(); 
      kill(parent, SIGKILL); 
      printf ("dead parent"); // not sure about it ?? 
      _exit(); 
    } 

    if(idProceso > 0){ 
     sleep (1); 
     printf ("parent id : %d. child id %d\n", 
     getpid(), idProceso); 

     wait (&childState); 

    } 

    return 0; 
} 
+2

사실 두 번 읽은 후에도 그 문장은 나에게 이해가되지 않습니다. 모든 경우에 나는 이미 죽은 과정이 종말이라고 생각할 수 있습니다. – drahnr

+0

나는 네가해야 할 일을 이해하지 못한다. 그러나 부모가 기다리지 않는 이유는'sleep'을 시작하기 때문이다. 그러나 그 아이는 즉시 그것을 죽일 것이기 때문에 그렇게한다. – teppic

+0

당신은 둘 다 옳다. 나는 그 문장이 혼란 스럽다고 생각한다. 그러나 그것은 교사가 우리에게 준 방식이다. - 프로세스 만들기 - 자식 프로세스 만들기 - 부모가 자식을 기다린다 - 자식이 부모를 죽인다. (이것은 내가 혼란스러워하는 부분이다.) 그리고 완료된다. – dlvx

답변

1

당신이 준 과제의 설명을 바탕으로, 나는 강사하거나 영어 또는 유닉스 시스템에서 프로세스의 개념 중 하나에 좋은 손잡이가없는 할당 교수를 생각한다.

제시된 해결책은 합리적이지만 절전 모드로의 호출을 제거합니다. Childstate는 정답이 아니며 모든 것을 필요로하지는 않습니다. 또한 SIGKILL을 부모에게 보내지 마십시오. SIGKILL은 프로세스를 종료하는 마지막 방법입니다. 부모 프로세스에 SIGTERM을 보내는 것이 좋습니다. 부모 프로세스는 Linux 컴퓨터를 사용하는 경우 sigaction을 사용하여 신호 처리기를 설치할 수 있습니다. 신호 처리기에서 "자식으로부터 신호를 수신했습니다"와 같은 멋진 메시지를 출력하고 exit를 호출 할 수 있습니다. 이 경우 교수님은 아마도 합격 점수를주기 위해 자신의 기술에 대해 적절한 인상을받을 것입니다.

더 나은 문제를 묻는다면 실패 할 것입니다. 실제로 문제를 풀기 전에 교수님 들께 문법 및 구두 교정을 제출해야만하는 것은 드문 일이 아닙니다.

1

내 문제는 부모도 프로그램에서 해당 ID를 아무데도

를 반환 할 자식 프로세스를 기다리는 부모에게 해당 ID를 반환하는 자식되지 않는 것 같다. 일어나는 유일한 커뮤니케이션은 아이가 부모에게 SIGKILL 신호를 보내는 것입니다.

그래서 내가 자식 프로세스를 만드는거야 생각하고, 그것이없는 아이 실행을 기다리는 부모를시키는, 말 부모를 죽이고 실행할 때.

예, 맞습니다. kill() 함수를 사용하여 SIGKILL 신호를 보내 부모 프로세스를 종료하지만 실제로 부모가 자식에 의해 종료되기를 기다립니다. 아이가 종료받을 수 있도록 부모가 기다리는 동안

wait (&childState); 

이 여기가, 종료 후, 부모가 이동하지만 프로그램에서 것, 아이를 아이가 종료 할 부모 대기 (가 정지)를 만든다 대기 중에는 그 자체가 부모를 종료합니다.

나는 뒤에 논리처럼 그래서 난 코딩 할 때 더 확실히 느낄 수, 포크 및 프로세스에 대한 자세한 내용을 알고 싶습니다.

이것은 가치가있는 something입니다.

0
$ ./foo.bin 
parent id : 6629. child id 6630 
child id : 6630. parent id 6629 
dead parentKilled 

은 그냥 sleep(1)를 제거하고 출력은 합리적인 것으로 보인다.

+0

예 그 같은 결과이다. 지금까지 수신하고있는 유일한 사실은 부모가 실제로 기다리고있는 경우입니다. (wait() 전후에 printf를 넣었으나 아무 것도 인쇄되지 않고 있습니다) – dlvx

+1

'parent id : .... . child id ...'는'parent' 프로세스에서 왔고'parent' 프로세스가 그 프로세스에서 멈추어야하는 정상적인 이유가 없습니다. 그래서 그것은 기다렸다가 붙어 있습니다. 그러나 정말로 아래 레벨로 가려면 디버거를 사용하거나 추적 프로그램을 호출하십시오. – drahnr

관련 문제