int execv (const char path, char const argv[]);
int execvp (const char file, char const argv[]);
int execve (const char path, char const argv[], char *const envp[]);
- l : 인자를 리스트로 제공
- v : 인자를 벡터로 제공
- p : file 인자 값을 사용자의 실행 경로 환경 변수에서 찾게 됨
* 환경 변수와 관련된 것은 보안상의 취약성이 있어 잘 사용하지 않는다.
* Path의 절대 경로를 써주면 사실 실행 경로를 찾아 사용할 필요가 없다.
- e : 새롭게 생성될 프로세스를 위한 새로운 환경 제공
* e(nvironment) : 환경 변수 포인터인 envp를 받는다.
<br>
- 예는 다음과 같다.
``` c
const char *args[] = { “test_program”, “test.file”, NULL };
int ret;
ret = execv(“/home/bin/test_program”, args);
if (ret == -1)
perror(“execv error: “);
#define _XOPEN_SOURCE /* WEXITSTATUS 등을 사용할 경우 */
#include <stdlib.h>
int system (const char *command);
ANSI C와 POSIX는 새로운 프로세스를 생성하고 실행한 다음 종료를 기다리는 일련의 동작을 하나로 묶은 인터페이스를 정의하고 있다.
프로그램 코드 내부에서 새로운 프로그램(쉘 스크립트나 유틸리티 등)을 실행할 때 유용하다.
sysmtem() 호출은 command 인자로 주어진 명령을 실행한다.
command 인자는 /bin/sh –c 와 같이 쉘에 바로 전달되어 실행된다.
호출이 성공하면 해당 명령의 상태를 반환한다.
실행한 명령의 종료 코드는 WEXITSTATUS로 얻을 수 있다. (다음 프로세스 종료 wait 참고)
int ret;
ret = system(“touch empty.file”);
if (ret == -1) {
printf(“system error”);
} else {
printf(“system result: %d\n”, WEXITSTATUS(ret));
}
프로세스 종료
#include <stdlib.h>
void exit (int status);
POSIX와 C89 표준은 현재 프로세스를 종료하는 표준 함수를 정의하고 있다.
status 인자는 프로세스의 종료 상태를 나타내기 위한 값으로 쉘 같은 다른 프로그램에서 확인할 수 있다.
EXIT_SUCCESS – 성공
EXIT_FAILURE – 실패
리눅스에서 일반적으로 0이 성공을 나타내고, 1 이나 -1 처럼 0이 아닌 값을 실패로 간주한다.
정상 종료
exit(EXIT_SUCCESS);
일반적으로 main() 함수가 프로그램 끝까지 진행되어 종료되는 경우, (c로 작성된 프로그램이라면)
명시적으로 exit() 코드가 존재하지 않아도 컴파일러가 묵시적으로 종료 코드 이후에 exit() 시스템 콜을 추가한다.
#include <stdlib.h>
int atexit (void (*function)(void));
// exit을 만나는 시점에 function을 수행하게 된다.
atexit()는 프로그램이 정상적으로 exit()에 도달해서 종료될 때 호출할 함수를 등록한다.
exec 계열 함수를 호출하면 등록된 함수 목록을 비우므로 새로운 프로세스 주소 공간에는 존재하지 않는다.
int main(void) {
if (atexit(final))
fprintf(stderr, “atexit() failed!\n”);
return 0; // 여기 다음 exit가 묵시적으로 호출된다는 의미 -> final()을 수행한다.
}
<br><br>
### 자식 프로세스 종료
``` c
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait (int *status);
main 프로세스가 fork된 자식 프로세스보다 먼저 종료가 되면 안되기 때문에, 이를 방지하기 위해 wait을 이용할 수 있다.
자식 프로세스가 어떻게 종료되었는지 상태 정보에 대한 뒷처리 작업을 해주어야 부모 프로세스가 끝나거나 다른 작업을 하는 것이 기본적인 구조이다.
그리고 자식 프로세스에서 실행파일을 실행한 다음에는 exit() 를 실행하여 종료한다.
exit () 함수를 통해 부모 프로세스에 SIGCHLD 시그널을 보내준다.
그러면 wait() 함수 다음에 있는 code를 읽어나가게 된다.
즉, fork () → exec () → wait () → exit ()
wait()을 이용하면 종료된 자식 프로세스의 정보를 얻을 수 있다.
wait()을 호출하면 종료된 프로세스의 pid를 반환하며, 에러가 발생한 경우 -1을 반환한다.
ECHILD – 자식 프로세스가 없다.
EINTR – 시그널 수신
status가 NULL이 아니라면 자식 프로세스에 대한 추가 정보가 status에 저장된다.
#include <sys/wait.h>
int WIFEXITED (status);
int WIFSIGNALED (status);
int WIFSTOPPED (status);
int WIFCONFTINUED (status);
int WEXITSTATUS (status);
int WTERMSIG (status);
int WCOREDUMP (status);
if (fork() == 0) /* child process */
return 1;
pid = wait(&status);
if (pid == -1)
perror("wait error: ");
printf("pid = %d\n", pid);
if (WIFEXITED(status)) {
printf("child process terminated with exit status (%d)\n",
WEXITSTATUS(status));
}
if (WIFSIGNALED(status)) {
printf("child process killed by signal (%d)\n", WTERMSIG(status));
if (WCOREDUMP(status)) { /* signal received SIGSEGV, etc */
printf("child process dumped core\n");
}
}
if (WIFSTOPPED(status))
printf("child process stopped by signal (%d)\n", WSTOPSIG(status));
if (WIFCONTINUED(status))
printf("child process continued\n");
return 0;
}
<br>
- 결과
![image](https://user-images.githubusercontent.com/86760744/180778195-05fed4c2-58cd-4bd6-86a0-9e5d06a60834.png)
10. 프로세스
프로세스 개요
프로세스란?
프로세스 ID
부모/자식 프로세스
# ps -ef
예시
프로세스 생성
프로세스 실행
# /home/bin/test_program test.file
int execl (const char path, const char arg, ...); int execlp (const char file, const char arg, ...); int execle (const char path, const char arg, ..., char * const envp[]);
int execv (const char path, char const argv[]); int execvp (const char file, char const argv[]); int execve (const char path, char const argv[], char *const envp[]);
프로세스 종료
void final(void) { printf(“atexit() succeeded!\n”); }
int main(void) { if (atexit(final)) fprintf(stderr, “atexit() failed!\n”); return 0; // 여기 다음 exit가 묵시적으로 호출된다는 의미 -> final()을 수행한다. }
자식 프로세스 종료 예시
int main(void) { int status; pid_t pid;
}