2014-10-19 2 views
0

프로그램 설명 대신 새 프로그램에 부모 프로세스 ID를 유지하고있다 : 나는 C와 리눅스에서 프로세스에 대한 가르쳐 도움이되는 프로그램을하고 있어요execv와 제로

. 프로그램은 fork을 사용하여 하위 프로세스를 만든 다음 부모와 자식 모두가 Parent Process, Child Process이라는 메시지를 일정 시간 출력합니다. 사물이 뒤섞이는 것을 막기 위해 부모는 자식 프로세스가 메시지를 모두 인쇄하기를 기다립니다. 더 재미있는 일을 만들기 위해 자식 프로세스는 execv을 사용하여 메시지를 인쇄하는 다른 프로그램을 호출합니다.

내가 읽은 것부터 execv 새 프로세스가 시작되지 않았습니다. 새 프로세스 이미지는 원래 프로세스 이미지를 오버레이합니다. 따라서 자식 프로세스가 새 프로그램을 시작할 때 그 새 프로그램 내부의 프로세스 ID는 0 인 자식 프로세스 ID와 같아야합니다.

문제 : 나는 그것이 바로 내가 프로세스 ID를 출력 새로운 프로그램에 들어가기로 제로 (예상대로)하지만입니다 execv를 호출하기 전에 자식 프로세스의 ID를 인쇄하고는있다

부모 프로세스 ID (하지만 자식 ID 여야 함).

누구든지 새 프로그램에 프로세스 ID가 0이 아닌 이유를 설명해주세요.

인수 :

  • Argv[1]는 = 횟수 자식 프로세스에 대한 메시지를 인쇄는
  • Argv[2]는 = 횟수는 부모 프로세스에 대한 메시지를 인쇄
  • Argv[3]는 = (초) 기다렸다 자식 프로세스에 대한 메시지 이후
  • Argv[4] = 부모 프로세스에 대한 메시지 이후에 대기 한 시간 (초) s
  • Argv[5] = 자식 프로세스가 시작될 새 프로그램에 메시지가 전송됩니다 (자식 프로세스가 메시지를 인쇄 할 수 있음).

초기 프로그램 :

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

int main(int arg, char *argv[]) { 

if(arg < 6) { 
    printf("\n\t(Task4.c) Please provide the right arguments\n\n"); 
    exit(EXIT_FAILURE); 
} 

char *argv2[3]; 

argv2[0] = argv[1]; 
argv2[1] = argv[3]; 
argv2[2] = argv[5]; 

int Nc = atoi(argv[1]); 
int Np = atoi(argv[2]); 
int Tc = atoi(argv[3]); 
int Tp = atoi(argv[4]); 
int n, exit_code; 

pid_t pid; 
char *message; 

printf("\n\n(Task4.c)\tfork program starting\n"); 

pid = fork(); 

//Let child go first before the parent 
if(pid != 0) { 
    int stat_val; 
    pid_t child_pid; 

    child_pid = wait(&stat_val); 

    printf("\n(Task4.c)\tChild has finished: PID = %d\n", child_pid); 
    if(WIFEXITED(stat_val)) 
     printf("(Task4.c)\tChild exited with code %d\n\n", WEXITSTATUS(stat_val)); 
    else 
     printf("(Task4.c)\tChld terminated abnormally\n"); 
} 

//Set up the values for the parent and child 
switch(pid) 
{ 
    case -1: 
     perror("(Task4.c)\tfork failed"); 
     exit(1); 
    case 0: 
     /* a child execute different program */ 
     printf("\n(Task4.c)\tpid=%d\n\n", pid); 
     if (execv ("child", argv2) <0) 
     { 
      printf ("(Task4.c)\texecl ERROR"); 
      exit (EXIT_FAILURE); 
     } 
     break; 
    default: 
     message = "This is the parent"; 
     n = Np; 
     exit_code = 0; 
     break; 
} 

//Print the message for the process using their values 
for(; n > 0; n--) { 
    printf("(Task4.c)\tpid=%d ", pid); 
    puts(message); 
    switch(pid) 
    { 
     case 0: 
      sleep(Tc); 
      break; 
     default: 
      sleep(Tp); 
      break; 
    } 
} 

printf("\n\n"); 

exit(exit_code); 
} 

새 프로그램이 자식 프로세스에 의해 호출되는 :

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

int main(int arg2, char *argv2[]) { 

if(arg2 < 3) { 
    printf("\n\t(child.c) Please provide the right arguments\n\n"); 
    exit(EXIT_FAILURE); 
} 

int Nc2 = atoi(argv2[0]); 
int Tc2 = atoi(argv2[1]); 

int Np2 = 5; 
int Tp2 = 1; 
int n2, exit_code2; 

//Here I was expected to get 0 as the pid... 
pid_t pid2 = getpid(); 
char *message2; 

printf("(child.c)\tchild program starting\n\n"); 
printf("(child.c)\tpid=%d \n\n", pid2); 

switch(pid2) 
{ 
    case -1: 
     perror("(child.c) fork failed"); 
     exit(1); 
    case 0: 
     message2 = argv2[2]; 
     n2 = Nc2; 
     exit_code2 = 37; 
     break; 
    default: 
     message2 = "(child.c)\tThis is the parent"; 
     n2 = Np2; 
     exit_code2 = 0; 
     break; 
} 

for(; n2 > 0; n2--) { 
    printf("(child.c)\tpid=%d ", pid2); 
    puts(message2); 
    switch(pid2) 
    { 
     case 0: 
      sleep(Tc2); 
      break; 
     default: 
      sleep(Tp2); 
      break; 
    } 
} 

exit(37); 
} 

예 출력 :

  • 으로 ("아이부터 안녕하세요"5 3 1 1) 등의 인수는

enter image description here

+1

자녀의 PID가 0이 아닙니다. 그것은 자식에서 fork에 의해 반환 된 값입니다. try try getpid() –

+0

"child.c"라는 새 프로그램에서 자식 프로세스가 호출하는 프로그램'getpid()'를 사용하여 새로운 pid_t를 설정했다. –

+1

아니요. 예를 든 자녀의 PID는 3077입니다. 부모의 PID를 인쇄하는 것을 본 적이 없습니다. –

답변

3

난 당신이 포크의 반환 값의 의미()을 혼동 생각합니다. 실제로는 실행중인 프로세스의 PID를 반환하지 않지만 새로 생성 된 자식의 PID (부모의 관점에서) 또는 유효한 PID가 아닌 0을 식별하는 식별자가 반환됩니다. 이 반환 값은 두 실행 스레드를 구별하고 부모가 스폰 된 자식을 추적하도록하는 방법 일뿐입니다.