exec*()
Bash 셸이 프로그램을 시작하는 데 사용하는 함수 계열의 변형을 이해하고 싶습니다 . 예를 들어 이 system()
함수는 을 사용하는데 execl()
Bash는 무엇을 사용합니까?
몇 가지 조사를 했지만 터미널에서 입력한 명령을 실행하기 위한 Bash 소스 코드의 올바른 위치인지 모든 사람과 다시 확인하고 싶었습니다.
Bash 버전 4.2.53을 조사한 결과 execute_cmd.c
.
execute_disk_command()
// I think this is where bash forks a child
pid = make_child (savestring (command_line), async);
...
exit (shell_execve (command, args, export_env));
shell_execve (command, args, env)
// I think this is where the child invokes the new program
execve (command, args, env);
위의 제어 흐름이 맞나요?
답변1
왜 이것을 알고 싶어하는지 모르겠지만 :
단 하나의 exec 호출만이 실제로 시스템 호출입니다.execve()
다른 모든 exec*() 함수는 execve()의 프런트엔드 역할을 하는 라이브러리 함수일 뿐입니다. truss(1) 또는 복제를 사용하면 다음을 사용하지 않는 한 시스템 호출만 표시됩니다.truss -u libc::