리눅스/리눅스 시스템 프로그래밍: 두 판 사이의 차이
→프로세스의 생성과 소멸
| 49번째 줄: | 49번째 줄: | ||
=== 프로세스의 생성과 소멸 === | === 프로세스의 생성과 소멸 === | ||
리눅스는 기본적으로 한 프로세스에서 프로세스를 추가로 만든다면 부모가 되는 자기 자신의 정보(열린 파일 디스크립터들이나 메모리 페이지 정보 등)를 복사하는 식으로 프로세스를 생성한다. 그래서 한 프로그램이 다른 프로그램을 실행해야 할 경우에는 fork() 후에 추가로 exec() 함수를 호출해서 프로세스가 실행하는 프로그램을 바꾸어야 한다. | |||
* fork() : 자식 프로세스를 부모 프로세스를 복사하는 식으로 만들고 그 PID를 반환. fork 이후 부모와 자식 중 어느 것이 실행될지는 정해지지 않는다. | |||
** vfork() : exec()을 실행할 때까지 메모리 정보를 자식에게 복사하지 않고 fork() | |||
** clone(func, childstack, flags, ...) : 프로세스가 아닌 스레드를 만든다. 따라서 호출할 때 프로그램 내의 특정 함수를 파라미터까지 넘겨 실행하도록 한다. | |||
* exec() : | |||
* execve(pathname, argv, envp) : 프로세스가 새 프로그램을 실행하도록 프로그램 정보를 교체 | |||
** execle, execlp, execvp, execv, execl 등의 파생 함수가 있다. | |||
* exit(status) : 종료 핸들러를 호출하고 stdio 버퍼에 남은 내용을 출력하며 _exit() 호출. 종료 핸들러는 atexit(handlerfunc)나 glibc의 on_exit(handlerfunc, args)으로 정의 | |||
** _exit(status) : 프로세스의 진정한 정상 종료 함수. 파일 디스크립터 정리, 세마포어나 IPC 기능 전부 해제, 메모리 매핑 해제 등을 수행하고 프로세서 그룹 내 자식들에게 SIGHUP과 SIGCONT 전송 | |||
* wait(&status) : 자식 프로세스가 종료될 때까지 부모 프로세스를 정지. waitpid(pid, status, options)로 특정 자식만 지정하여 기다릴 수 있다. | |||
셸 명령어를 호출해 실행해야 할 경우에는 system(command)가 별도로 존재한다. | |||
=== 프로세스 스케줄링 정책과 우선순위 === | === 프로세스 스케줄링 정책과 우선순위 === | ||
=== 경량 프로세스(Lightweight Process) === | === 경량 프로세스(Lightweight Process) === | ||