execl() 함수 이용하여 외부 파일 실행하기

int execl(const char *path, const char *arg0, ..., const char *argn, (char *)0);
  • path : 지정한 경로명의 파일(상대, 절대 경로 모두 가능)
  • arg0 ~ argn : 인자
  • 0 : 인자의 끝을 지정하는 null pointer
  • exec하고 나면 해당 파일을 자신의 메모리에 덮어쓰기 때문에 실행되다 알아서 종료

예시 코드

#include <stdio.h>
#include <unistd.h>

int main(){
  execl("/bin/ls", "ls", "-a", 0);
  return 0;
}

이 코드의 결과물은 아래 command의 결과물과 같다.

$ ls -a

그렇다면 실제로 c코드를 생성하고 실행시키고 freopen()함수를 이용해보자.

외부 파일 생성 및 실행시키고 freopen 이용해서 input과 output 받기

parent.c

#include <stdio.h>
#include <unistd.h>

int main(){
  execl("/usr/bin/gcc", "gcc", "-o", "child", "child.c", (char *) NULL);
  freopen("uppercase.txt", "r", stdin);
  freopen("lowercase.txt", "w", stdout);
  execl("./child", 0);
  return 0;
}

parent.c를 위와 같이 하면 실행이 완벽히 되지 않는다.

  • exec하고 나면 해당 파일을 자신의 메모리에 덮어쓰기 때문에 실행되다 알아서 종료된다.
  • 따로 프로세스를 진행해주어야 한다.
  • 그리고 컴파일을 하는 execl이 끝날 때까지 기다렸다가 진행해야 한다.

때문에 child process를 생성해서 진행해주자!

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(){
  pid_t child_pid ;
  int exit_code ;
  child_pid = fork() ;
  if (child_pid == 0) {
    
    execl("/usr/bin/gcc", "gcc", "-o", "child", "child.c", (char *) NULL);
  }
  else {
    wait(0);
    freopen("../uppercase.txt", "r", stdin);
    freopen("lowercase.txt", "w", stdout);
    execl("./child", 0);
  }
  wait(&exit_code) ;
  exit(0) ;
}
  • Line 10: child process 생성
  • Line 13: child process에서 컴파일 하기
  • Line 16: parent process에서 child process 끝날 때까지 기다린다.(중요하다!)
  • Line 17, 18: freopen()을 이용해서 입출력 파일을 설정
  • Line 19: 실행 후 종료

child.c

#include <stdio.h>

int main(){
  int c;
  while(( c=getchar() ) != EOF) putchar(tolower(c));
  return 0;
}

실행결과

jeongjinhyeog$ gcc parent.c -o parent
jeongjinhyeog$ ./parent
jeongjinhyeog$ cat lowercase.txt 
this text is written in uppercase.
there isn't any lower case letter in the entire file.

다음과 같이 원하는대로 좋은 결과가 도출됨을 볼 수 있다!