(InstaGrap 개발) execl 사용법, freopen 사용법 (외부 파일 gcc컴파일, 실행 C예제코드)
by 줌코딩
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.
다음과 같이 원하는대로 좋은 결과가 도출됨을 볼 수 있다!
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Subscribe via RSS