中庸

Trace02 는 Foreground job의 형태로 실행파일을 실행시키는 문제입니다.

쉘에서 새로운 프로그램을 실행시키기 위한 방법은
1. fork()를 통해서 자식 프로세스를 생성하고
2. 자식 프로세스에서 execve 을 통해 새로운 프로그램을 실행시키는 것입니다.

execve는 제어흐름을 변경하여 새로운 프로그램을 실행시키고 다시 원래 프로그램으로 돌아오지 않았다는 것을 복기하며 trace02를 진행해봅시다!

Trace03, Trace04 는 각각 프로그램을 foreground job으로 argument 없이 실행, foreground job으로 argument를 갖고 실행하는 문제입니다. Trace02를 해결하면 execve 호출을 통해 같이 해결됩니다.

최종코드

void eval(char *cmdline) {
	char *argv[MAXARGS];
    pid_t pid;
    
    parseline(cmdline, argv);
    
    if (!builtin_cmd(argv)) {
      if ( (pid = fork() ) == 0 ) {
      //fork로 자식 프로세스 생성 후 자식 프로세스에서 execve 실행
          if ( execve(argv[0], argv, environ) < 0 ) {
              printf("%s : Command not found\n\n", argv);
              exit(0); // command not found이면 자식 프로세스 종료
          }
      }
      usleep(10000);
    }
    return 0;
}

'시스템 프로그래밍' 카테고리의 다른 글

[Shell Lab] Trace07  (0) 2022.11.15
[Shell Lab] Trace05, Trace 06  (0) 2022.11.15
[Shell Lab] Trace01  (0) 2022.11.15
[Shell Lab] Trace00  (0) 2022.11.15
[System Programming] Basic Skill for Shell Lab  (0) 2022.11.15
profile

中庸

@짱일모

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!