티스토리 뷰
지난 포스팅에 이어서 리눅스 프로세스 관련 예제에 대해 살펴보겠습니다! 지난번 포스팅에서 프로세스 제작 사이에 숫자를 프린트 하는 것 까지 했습니다!
6. Execve() 실행 파일 만들기
exec() 호출을 이용해 ls 명령어를 -l 옵션과 -a 옵션을 줘서 실행시켜보겠습니다!
#include <stdio.h>
#include <unistd.h>
int main(){
char *new_argv[]={"ls","-l","-a",NULL};
execve("/bin/ls",new_argv,NULL);
printf("Hello World! \n"); //출력안됨
return 0;
}
이 코드에서 주의해서 볼 부분이 있습니다. 바로 printf("Hello world! \n"); 이 코드입니다! 위의 코드에서 printf는 실행되지 않습니다. 그 이유는 exec() 명령어 때문인데요! exec()는 프로세스의 code, data, stack을 전부 지우고 새로운 코드로 출력하기 때문입니다.
주의해서 볼 부분이 하나 더 있습니다!! 바로 execve() 입니다. exec() 명령어에는 다양한 명령어가 있습니다. exec() 호출이 하는 일은 모두 똑같지만 세세한 옵션이 다릅니다. exec() 호출에 대해 자세히 알아보겠습니다!! 혹시 exec() 호출에 대해 잘 모르시다면 제 블로그의 다른 포스팅 보고 오세요~
- execl
- execv
- execle
- execve
- execlp
- execvp
exec뒤에 붙은 글자는 각각의 옵션을 알려줍니다!!
- v : exec()에 넘겨주는 argument가 벡터이다. (const* char argv[])
- l : exec()에 넘겨주는 argument가 리스트다. (const char *arg0, ...)
- e : 환경 변수로 char* const envp[] 배열을 받는다
- p : 파일을 찾기 위해 PATH 환경 변수를 사용한다.
7. fork()와 exec()를 활용해서 부모 프로세스로부터 ls -l 명령을 수행하는 자식 프로세스 만들기
지난 포스팅과 이번 포스팅을 합쳐서 자식 프로세스를 만드는 코드를 짜보겠습니다~!
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
pid_t pid;
pid=fork();
if(pid==0){ //child process
char *new_argv[]={"ls","-l",NULL);
execve("/bin/ls",new_argv,NULL);
//exit(101); 안해도됨. execve가 된 순간 child process는 ls가 되기 때문에 따로 exit를 명시하지 않아도 된다.
} else{ //parent process
int exitstatus;
wait(&exitstatus);
}
printf("Hello World!);
return 0;
}
8. 명령어를 Argument로 받아서 해당 명령어를 실행하는 자식 프로세스 만들기!
프로세스 관련 주제에서 마지막 예제입니다~! main()에서 원하는 명령어를 my_system 함수의 입력값으로 넣으면 해당 명령어가 실행되는 자식 프로세스를 만들어보겠습니다!
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int my_system(char *command){
int status;
pid_t pid;
pid=fork();
if (pid == 0)
{
execl("/bin/bash","bin/bash","-c",command,NULL);
}
else{
wait(&status);
}
return 0;
}
int main(void){
int status;
status=my_system("ls -l | wc");
printf("exit code %d\n",WEXITSTATUS(status));
return 0;
}
ls -l 이 아니라 ps -ef 와 같은 어떤 명령어라도 실행시키는 mysytem 예제입니다!! 부모 프로세스에서 fork() 호출을 통해 복제하고 exec() 호출을 통해 실행 코드를 바꿔서 자식 프로세스를 생성했습니다! exec() 호출은 리스트로 명령어를 받아왔기 때문에 execl 을 활용했습니다.
감사합니다~
'👩🏻💻개발공부 > 리눅스' 카테고리의 다른 글
10. 리눅스 시그널(Signal) 예제로 알아보기 (1/2) 🖋 (0) | 2022.12.12 |
---|---|
10. 리눅스 시그널(Signal) 개념 알아보기🖋 (2) | 2022.12.12 |
9. 리눅스 프로세스(Process) 예제로 알아보기 🔍(1/2) (0) | 2022.12.11 |
9. 리눅스 프로세스(Process) 개념 알아보기🔎 (0) | 2022.12.11 |
8. 리눅스 시스템 콜 예제로 알아보기(2/2)🔍 (0) | 2022.12.01 |
- Total
- Today
- Yesterday
- 개발일지
- 혼공학습단
- 개발
- 공룡책
- 운영체제
- 깃 예제
- 스페인
- 리눅스
- 혼공단 9기
- 자바스크립트
- 혼공단 SQL
- C++
- JavaScript
- AWS
- 프로젝트
- 혼공
- SQL
- 백준
- 스페인 교환학생
- Process
- googleapis
- 교환학생
- 프로그래머스
- JS
- MySQL
- Signal
- 혼공단
- nodejs
- 해커톤
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |