끄적끄적

반응형

/* 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를 얻어내죠.


반응형
Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]