system(3)

#include <stdlib.h>

int system(const char *command);

process에서 새로운 프로그램을 실행하기 위해서는 fork()로 child process를 생성하고, child process의 binary를 실행을 하려는 프로그램으로 대체하는 exec 계열의 함수를 호출하여야 합니다. 실행하기 매우 귀찮은 작업입니다.

이 system(3)함수는 이 작업을 매우 편리하게 해주는 함수입니다.

  

이 함수의 호출은 아래와 비슷한 형태로 실행됩니다. 

int system(const char *command);
{
    pid_t child_pid;
    int   status;
    
    ......

    child_pid = fork();

    if(child_pid == 0) // child process이면
    {
        if(execl("/bin/sh", "sh", "-c", command, (char *) NULL) == -1) 
        {
            _exit(127);
        }
    } 
    else if(child_pid > 0) // parent process이면
    {
        waitpid(child_pid, &status, 0);
        return WEXITSTATUS(status);
    } 
    else // 오류가 발생하였습니다.
    {
        return -1;
    }
}

system(3)함수를 실행하게 되면, 이 함수를 호출한 부모 process는 SIGCHLD signal이 발생할 때까지 blocking 상태가 되고, SIGINT, SIGQUIT은 무시합니다.

만약, command가 NULL이면 이 시스템에서 /bin/sh shell이 유효한지 체크할 수 있습니다. 

 

 

파라미터

command
    - 실행하려는 명령어 또는 shell 프로그램 등에 대한 pull path 또는 상대 path
    - 만약 PATH 환경변수에 등록된 PATH이면 명령어만 입력하면 됩니다.

 

RETURN

command가 NULL일때
0 
    - sh가 사용할 수 없는 상태
0이 아님
    - sh가 사용할 수 있는 상태


command가 NULL이 아닐때
 - child process가 생성되지 않은 경우
   -1이 return되고 errno오 오류가 설정되며, status의 값이 채워지지 않는다.
   errno의 값은 fork(2)함수의 결과와 같습니다.
 
 - child process에서 command를 실행할 수 없으면
   status의 값이 127로 설정됩니다.
 
 - 정상적으로 실행했다면 
   명령어 종료 상태 값을 return 합니다. 
   WIFEXITED(), WEXITSTATUS() 등의 macro함수로 체크해야 합니다. (waitpid(2) 참조)
   

 


활용 예제

 

Sample

#include <stdlib.h>

....

system("chmod 644 /home/user1/sample.txt");

 


see also : fork(2) execl(3) Process 관리 함수

 

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요