끄적끄적

반응형

/* runls3 -- run ls in a subprocess */

main()

{

int pid;

printf("Parent pid of a.out: %d\n", getppid());

pid = fork();


/* code for parent process */

if (pid > 0 ) {

wait((int *)0); /* wait for completion of child process */

printf("\nParent process id: %d, parent pid: %d, ls completed\n", getpid(), getppid());

exit(0);

}


/* code for child process */

if (pid == 0) {

printf("Child process id: %d, parent pid: %d\n", getpid(), getppid());

execl("/bin/ps","ps",(char *)0); /* doesn't return here */

fatal("execl failed");

}


/* error occurs */

fatal("fork failed");

}

fatal(char *s)

{

perror(s);

exit(1);

}




이 소스에서


호출한 system call(fork,getpid,getppid,wait,execl,exit 등)에 대한 설명 좀


부탁드립니다..ㅠ.ㅜ 





fork 는 프로세스를 복제하는 함수입니다.

fork가 실행되는 순간에 동일한 위치를 수행하는 자식프로세스가 생성됩니다.

fork가 리턴하는 값은 Process ID로 부모 프로세스는 자식의 프로세스 아이디값을 리턴 받고 자식 프로세스는 0을 리턴 받습니다.

즉 fork가 실행되면 동일한 프로그램을 동일한 위치에서 수행하는 프로세스가 두 개가 됩니다.


pid라는 변수에 들어있는 값이 0이 아닌 프로세스는 부모 프로세스인 셈이고

wait()함수를 호출하게 되는군요.


자식 프로세스는 execl()함수를 실행하게 되고요.


wait()함수는 프로세스 자신의 자식 프로세스들 중 아무 프로세스나 하나가 종료되길 기다리는 함수입니다.

자식 프로세스가 종료되고 나면 printf하고 나서 종료 (exit(0))하는 군요.


자식 프로세스는 execl함수를 실행하는데 

이 함수는

함수를 호출하는 프로세스를 실행 가능한 다른 프로세스로 치환합니다.

"bin/ps"는 치환할 프로세스(프로그램?)의 경로,

"ps"부터는 아규먼트 0번, 1번, 2번 이렇게 됩니다.

아규먼트의 종료는 NULL로 알려주게 되어 있는데 (char *)0으로 지정했군요.

즉 자식 프로세스는 /bin/ps디렉토리에 있는 ps로 바뀌어서 ps명령을 실행하고

종료합니다.

이 치환 과정이 실패하게 되면 프로그램은 그대로 진행하게 되어서 다음줄에 있는

fatal()을 호출합니다. /bin/ps에 ps 실행파일이 있다면 이 구문은 실행되지 않죠.


getpid() 는 함수를 호출한 프로세스의 process id를 얻어내는 함수 입니다.

부모프로세스와 자식 프로세스가 얻게될 값은 서로 다르겠죠.


getppid()는 parent process id를 얻어내는 함수 입니다.

자신을 생성한 부모의 Pid를 얻어내죠.


반응형