부모 프로세스와 계속 작업 할 수 있도록 백그라운드에서 새 프로세스를 실행하려고합니다.백그라운드에서 새 하위 프로세스 실행하기 linux
나는 fork와 execl을 사용했다. 나는 인수 & execl 함수 명령에 추가하려고했지만 작동하지 않습니다
execl("newproc","newproc","arg1","&",NULL);
어떤 해결책이 있습니까?
부모 프로세스와 계속 작업 할 수 있도록 백그라운드에서 새 프로세스를 실행하려고합니다.백그라운드에서 새 하위 프로세스 실행하기 linux
나는 fork와 execl을 사용했다. 나는 인수 & execl 함수 명령에 추가하려고했지만 작동하지 않습니다
execl("newproc","newproc","arg1","&",NULL);
어떤 해결책이 있습니까?
&
은 프로그램의 명령 줄 옵션이 아닙니다. 대신, 이것은 백그라운드에서 명령을 넣는 특별한 쉘 구문 일뿐입니다. 백그라운드 프로그램의 두드러진 특징은 터미널에 연결되어 있지 않으며 터미널이 프로세스가 완료 될 때까지 기다리지 않는다는 것입니다. 적절한 기능은 daemon()
입니다. 사용 방법을 읽어 보려면 man daemon
을 수행하십시오.
&
은 명령 인수가 아니며, 쉘이 명령을 백그라운드에서 실행하는 데 사용하는 플래그입니다. 이 경우 쉘의 작업을 수행하고 있습니다 ... &
을 제거하십시오. fork()
이라고 말한 이후로, fork가 반환 된 후 자식 프로세스에서 execl()
만 수행하는 한 백그라운드에서 이미 실행 중입니다.
fork
을 사용했기 때문에 아이는 백그라운드에서 실행됩니다. 자녀는 부모와 평행을 유지합니다 (exec
성공한 경우). 자식 프로세스가 성공했는지 여부에 신경을 쓰면 결국 waitpid
을 호출하여 종료 상태를 수집해야합니다. 그렇지 않으면 fork
을 번 두 번 호출하고 하위 처리 과정을 init
이 적용하도록 중간 처리 프로세스를 종료해야합니다 (wait
).
@ 마가 말했듯이 &
은 필요하지 않습니다. 그러나 또 다른 변화가 필요하다. execl
은 가변 함수이므로 함수 프로토 타입은 올바른 인수로 인수를 변환하지 않습니다. 따라서 최종 인수는 올바른 유형으로 전달되어야합니다. 단지 (char*)NULL
으로 변경하십시오.
코드가 작동하지 않는다고 말씀하셨습니다. 그 이유는 단지 가짜 인 &
이 원인 일 수 있지만 첫 번째 인수로 인해 발생할 수도 있습니다. execl
함수는 명명 된 프로그램에 대해 $PATH
을 검색하지 않으므로 newproc
이 실제로 현재 디렉토리에 있지 않으면이 execl()
호출이 반환됩니다. execl
이 반환되면 항상 문제가 있음을 나타냅니다. 이를 해결하는 가장 간단한 방법은 execl()
대신 execlp()
을 사용하는 것입니다. 다른 방법은 절대 경로를 첫 번째 인수로 지정하는 것입니다. 상대 경로를 첫 번째 인수로 지정할 수도 있지만 거의 유용하지는 않습니다.
데몬()은 내가 찾고있는 것입니다. thx – user655561
'daemon (3)'은 시스템 호출이 아닌 * 라이브러리 함수입니다 ('man' 페이지의 섹션 2에 나열된 이중'fork' 및'close' 시스템 호출을 통해 구현됩니다)). 실제로 '데몬'은 적절한 기능입니다. –
흠, 옳은 것 같습니다. 유닉스 프로그래밍을 한 지 오래되었지만 시스템 호출로 표시되는 것은 분명히 잘못되었다는 것을 기억합니다. 어쨌든 적절한 참고 문헌은 스티븐스 (Stevens)의 책입니다.이 책은이 동등성을 기록합니다 (iirc, 제 맨 페이지는 그렇지 않습니다) –