• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

exec 관련 궁금한 사항

22.10.24 14:39 작성 조회수 174

0

시스템 프로그램밍 이론 실습 열심히 듣고 있습니다.

fork(), exec() 관련 강의를 듣고 문의 사항이 있어서..

exec 계열을 실습 예제에서 ls 관련 내용을 예시로 설명되어 있는데

이해는 한 것 같은데... 이걸 어떻게 프로그램에 써먹지 ? 하는 의문이 생기더군요

exec 사용해서 리눅스 명령어를 쓰는 것으로 활용될 리는 없는데....

 

그래서 생각을 한 건데요..

별도의 C로(꼭 C 로 짤 필요는 없는 것 같고) 어떤 동작을 하는 실행파일 만들고

execl 의 인수를 넣을 때 이 실행 파일을 등록하면 작동하지 않을까 생각을 해서 해보았는데

되더군요. ㅎㅎㅎㅎ( 이전 강의에 작성한 "epoll" 실행파일을 등록 해봄)

ret = execl("../lec13/epoll","./epoll",NULL);

ret = execl("../lec13/epoll","epoll",NULL);

ret = execl("../lec13/epoll",argv[0],NULL); 

저는 이렇게 이해 했는데 exec 계열은 이런 식으로 사용하는 것이 맞는 건지 여쭤봅니다.

아니면 다른 사용법이 있는 건지...

 

그리고

ret = execl("../lec13","epoll",NULL);

ret = execl("../lec13/","epoll",NULL);

이런식으로 사용하니까.. 에러가 발생하는데요..

제가 execl( const char *pathname ....) 잘못 이해 하고 있는 것 같은데...

 

-- error message--

root@mmsr:/home/chowork/c_folder/sys_prg/lec15# ./exec_tmp

origin process pid: 516153

parent process pid: 516153, child process: 516154

this is a test function(pid 516153)

child process pid: 516154

execl() error

: Permission denied

child 516154 returned 255

 

 

 

 

 

답변 2

·

답변을 작성해보세요.

0

조병기님의 프로필

조병기

질문자

2022.10.24

빠른 답변 감사드립니다.

답변내용중

"본문의 에러가 발생한다는 예제에서는 디렉터리를 지정하셨네요. 성공한 예제와 같이 실행 파일의 경로를 지정해주셔야 합니다."

위 설명중 "실행파일의 경로"는 " 디랙토리명(상대 or 절대)" +" /" +" 실행파일명"

을 의미하는 거줘?

0

안녕하세요. 조병기님

C 프로그래밍에서 fork()/exec()을 사용하는 것은 멀티-프로세스 프로그래밍에서 꽤나 자주 사용됩니다. :) 새로운 자식 프로세스를 생성하고, 원하는 프로그램을 실행시키기 위해서죠. 부모 프로세스는 자식 프로세스를 케어해줘야 하는 부분도 있구요. 물론 system()과 같은 더 쉬운 방법이 있습니다만, system()은 쉘을 띄우는 방법이라 fork and exec에 비해 느립니다. child process를 띄우는 것이 자주 발생한다면 system()은 좋은 선택이 아닙니다. 이럴 땐 fork and exec를 사용하셔야 좋습니다. 간단한 쉘 명령문을 실행하고, 그 결과를 이용하는 경우는 system()이 더 좋은 선택이 될 수 있습니다.

exec() 계열의 API 종류가 많은데요, 첫번째 파라미터로 pathname을 받는 API는 실행될 파일의 경로(절대 경로 혹은 상대 경로)를 지정하셔야 합니다. 본문의 에러가 발생한다는 예제에서는 디렉터리를 지정하셨네요. 성공한 예제와 같이 실행 파일의 경로를 지정해주셔야 합니다.

참고로, execlp()와 같이 첫번째 파라미터로 file 이름을 받는 API는 실행파일의 이름만 지정해주셔도 됩니다. 단, 실행 파일이 PATH 환경 변수에서 지정한 디렉터리에 포함되어야 실행 가능합니다.

잘 이해되지 않는 부분이 있으면 댓글주세요! 감사합니다!!