2012-06-10 2 views
0

부모 프로세스와 계속 작업 할 수 있도록 백그라운드에서 새 프로세스를 실행하려고합니다.백그라운드에서 새 하위 프로세스 실행하기 linux

나는 fork와 execl을 사용했다. 나는 인수 & execl 함수 명령에 추가하려고했지만 작동하지 않습니다

execl("newproc","newproc","arg1","&",NULL); 

어떤 해결책이 있습니까?

답변

2

&은 프로그램의 명령 줄 옵션이 아닙니다. 대신, 이것은 백그라운드에서 명령을 넣는 특별한 쉘 구문 일뿐입니다. 백그라운드 프로그램의 두드러진 특징은 터미널에 연결되어 있지 않으며 터미널이 프로세스가 완료 될 때까지 기다리지 않는다는 것입니다. 적절한 기능은 daemon()입니다. 사용 방법을 읽어 보려면 man daemon을 수행하십시오.

+0

데몬()은 내가 찾고있는 것입니다. thx – user655561

+1

'daemon (3)'은 시스템 호출이 아닌 * 라이브러리 함수입니다 ('man' 페이지의 섹션 2에 나열된 이중'fork' 및'close' 시스템 호출을 통해 구현됩니다)). 실제로 '데몬'은 적절한 기능입니다. –

+0

흠, 옳은 것 같습니다. 유닉스 프로그래밍을 한 지 오래되었지만 시스템 호출로 표시되는 것은 분명히 잘못되었다는 것을 기억합니다. 어쨌든 적절한 참고 문헌은 스티븐스 (Stevens)의 책입니다.이 책은이 동등성을 기록합니다 (iirc, 제 맨 페이지는 그렇지 않습니다) –

2

&은 명령 인수가 아니며, 쉘이 명령을 백그라운드에서 실행하는 데 사용하는 플래그입니다. 이 경우 쉘의 작업을 수행하고 있습니다 ... &을 제거하십시오. fork()이라고 말한 이후로, fork가 반환 된 후 자식 프로세스에서 execl() 만 수행하는 한 백그라운드에서 이미 실행 중입니다.

4

fork을 사용했기 때문에 아이는 백그라운드에서 실행됩니다. 자녀는 부모와 평행을 유지합니다 (exec 성공한 경우). 자식 프로세스가 성공했는지 여부에 신경을 쓰면 결국 waitpid을 호출하여 종료 상태를 수집해야합니다. 그렇지 않으면 fork 번 두 번 호출하고 하위 처리 과정을 init이 적용하도록 중간 처리 프로세스를 종료해야합니다 (wait).

@ 마가 말했듯이 &은 필요하지 않습니다. 그러나 또 다른 변화가 필요하다. execl은 가변 함수이므로 함수 프로토 타입은 올바른 인수로 인수를 변환하지 않습니다. 따라서 최종 인수는 올바른 유형으로 전달되어야합니다. 단지 (char*)NULL으로 변경하십시오.

코드가 작동하지 않는다고 말씀하셨습니다. 그 이유는 단지 가짜 인 &이 원인 일 수 있지만 첫 번째 인수로 인해 발생할 수도 있습니다. execl 함수는 명명 된 프로그램에 대해 $PATH을 검색하지 않으므로 newproc이 실제로 현재 디렉토리에 있지 않으면이 execl() 호출이 반환됩니다. execl이 반환되면 항상 문제가 있음을 나타냅니다. 이를 해결하는 가장 간단한 방법은 execl() 대신 execlp()을 사용하는 것입니다. 다른 방법은 절대 경로를 첫 번째 인수로 지정하는 것입니다. 상대 경로를 첫 번째 인수로 지정할 수도 있지만 거의 유용하지는 않습니다.

관련 문제