티스토리 뷰

728x90

 지난 포스팅에 이어서 리눅스 프로세스 관련 예제에 대해 살펴보겠습니다! 지난번 포스팅에서 프로세스 제작 사이에 숫자를 프린트 하는 것 까지 했습니다! 

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 을 활용했습니다. 

 감사합니다~

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함