리눅스에선 새로운 프로스세스를 생성할 때, fork()
와 exec()
시스템콜을 통해서 생성한다.
exec 시스템콜이 실행 완료된 후(exit), wait()
시스템콜이 실행된다.
부모 프로세스는 부모 프로세스로부터 fork된 자식프로세스의 실행을 기다리고 있는다.
wait 시스템콜은 자식 프로세스가 실행이 완료될 때까지, 부모 프로세스를 대기하도록 명령한다.
이는 부모 프로세스가 먼저 실행 완료되어, 자식 프로세스가 고아 상태가되는 상황을 막기 위함이다.
위 코드를 컴파일해 실행해보면 다음과 같은 결과를 확인할 수 있다.
그럼 쉘을 만들어 보자.
쉘 코드를 컴파일하고 실행하면, 위처럼 경로와 실행할 명령어를 함께 입력해주어야 실행이 가능하다.
이는 자식 프로세스를 생성하고, execl()
함수를 실행했기 때문이다.
만약, 경로 입력없이 명령어만 받고 싶다면, bin
디렉토리는 대부분의 환경변수에 포함되어 있기 때문에 execlp()
함수로 실행하도록 바꿔주면 된다.