http://blog.naver.com/chhh92/220520016705
본인이 개발한 프로그램에서 외부 프로그램을 실행하기 위해 아래 방법들을 사용하는데.
system()
exec 시리즈 함수
system()은 "sh -c" 명령과 system()의 인자값이 합쳐져 실행되 쉘에서 사용하는 명령어를 거이 모두 쓸 수 있고, 명령어를 이용해 프로그램을 실행하기에 간단하고 편리하다. 그러나, 항상 동기적이라 실행한 외부프로그램이 종료되어야 다음 코드가 실행된다.
exec 시리즈 함수들을 호출하면 호출한 프로세스를 외부 프로그램의 프로세스로 바꿔치기(?)해 호출 전과 내용이 완전 다른 프로세스가 되어 프로세스가 종료되면 exec를 호출한 프로세스로 돌아올 수 없다. 그래서 fork로 자식프로세스를 만들어 자식프로세스가 exec 함수를 사용하는 방법으로 fork-exec 기법이있고, 부모프로세스에서 waitpid()를 통해 자식프로세스의 종료대기를 할 수 있어 동기적, 비동기적 프로그래밍이 가능하다.
fork-exec와 system의 각 장점을 모아둔거라 볼 수있는 posix_spawn()가 있는데.
system()처럼 명령어로 프로그램을 실행할 수 있고("sh -c" 를 사용해서)
exec처럼 파일경로로 실행할 수 있다.
exec처럼 외부 프로그램의 인자를 exec함수 호출시 인자값으로 보내기때문에 system()사용시 인자 최대 길이(ARG_MAX: argument list too long)때문에 고통 받을일이 없으며
fork-exec와 같이 posix_spawn()도 새로운 프로세스를 생성하기 때문에 waitpid()로 동기적, 비동기적 프로그래밍이 가능하고.
그러면서 system()와 같이 구현이 간단하다.
아래는 posix_spawn()으로 system()을 구현한 것이다.
void run_command(char *cmd)
{
pid_t pid;
int status;
char *argv[] = {"sh", "-c", cmd, NULL};
posix_spawn(&pid, "/bin/sh", NULL, NULL, argv, environ);
waitpid(pid, &status, 0);
}
9번줄의 waitpid를 주석처리나 비동기적 프로그래밍이 가능하다.
https://www.systutorials.com/a-posix_spawn-example-in-c-to-create-child-process-on-linux/