프로세스 생성
- fork() 시스템 호출
-> 부모 프로세스를 똑같이 복제하여 새로운 자식 프로세스를 생성
-> 자기 복제
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
// 새로운 자식 프로세스 생성
// 자식 프로세스에게는 0 반환, 부모 프로세스에게는 자식 프로세스 ID 반환
fork()는 한 번 호출되는데, 두 프로세스에서 반환 작업이 다르게 이루어진다.
- 이 후 부모 프로세스와 자식 프로세스는 병행적으로 각각 실행을 계속
부모 프로세스와 자식 프로세스의 구분은 fork()호출 후 두 프로세스의 반환 값이 다르기에 반환값으로 확인.
-> 반환값을 통해 서로 구분하며, 서로 다른 과업 실행 가능
ex)
pid = fork();
if(pid==0)
{자식 프로세스가 실행할 코드}
else
{부모 프로세스가 실행할 코드}
프로세스 기다리기
- wait()
-> 자식 프로세스 중 하나가 끝날 때까지 기다린다.
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status); //끝난 경우 알려주기 위해 사용
pid_t waitpid(pid_t pid, int* statloc, int options);
child = wait(&status); // 자식 프로세스가 끝나길 기다림.
pid1=fork();
waitpid(pid1,&status,0); // 어떤 자식 프로세스를 기다릴지 결정
fork를 했을 때, 부모가 열어 놓은 파일을 자식이 공유.
부모의 fd 테이블이 자식에게 복사된다.(같은 파일 디스크립터 공유)
프로그램 실행
- fork() 후 프로세스 이미지가 그대로 복제되었다.
- 자식 프로세스에게 새 프로그램 실행 -> exec() 시스템 호출 사용
-> 프로세스 내 코드 영역을 새로운 프로그램의 코드로 대체한 후 실행
- 보통 fork() 후에 exec()
exec()
- 현재 코드 영역 대체 후, 새 프로그램의 main()실행
- 성공한 exec()코드는 절대로 기존 코드로 복귀하지 않는다.
자주 사용하는 명령어
int execl(char * path, char* arg0, char* arg1, ..., char* argnm NULL)
int execvp(char* file, char* argv[])
system() 함수 구현 : fork(), exec(), waitpid() 시스템 호출로 구현
dup2(fd,1); 1은 표준 출력이며, 1에 fd를 덮어씌운것과 똑같다.
'학교수업' 카테고리의 다른 글
인공지능개론 7주차 (0) | 2022.04.20 |
---|---|
UNIX서버 6주차 (0) | 2022.04.20 |
UNIX서버 4주차 (1) | 2022.04.19 |
윈도우즈 프로그래밍 5주차 (0) | 2022.04.16 |
윈도우즈 프로그래밍 6주차 (0) | 2022.04.16 |