/* 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를 얻어내죠.
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를 얻어내죠.
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
fork()와 exec() [펌] (0) | 2009.05.26 |
---|---|
fork() 함수를 이용하여 프로세스를 생성하는 이유가 뭔가요? (0) | 2009.05.26 |
fork()이야기 1. (0) | 2009.05.25 |
execl 다른 프로그램 실행 (0) | 2009.05.23 |
유닉스함수. exec,execv,execl계열 함수 7개의 기능 (0) | 2009.05.23 |