현재 C++ 내에서 작은 셸을 만드는 중입니다.이전 작업의 sigchld()를 기반으로 새 작업 실행
사용자는 exe1 && exe2 &
과 같은 프롬프트에서 작업을 입력 할 수 있습니다. BASH 셸과 마찬가지로 이 성공적으로 종료되는 경우에만 exe2
을 실행합니다. 또한 전체 작업을 배경에서 수행해야합니다 (후행 &
연산자로 지정).
지금은 jobManager
으로 작업 실행을 처리하고 job
구조에는 작업 실행 파일과 개별 인수/조건이 들어 있습니다. 작업은 fork()
을 호출 한 다음 적절한 인수를 사용하여 execvp()
을 호출하여 시작됩니다. 작업이 끝나면 에 대한 신호 처리기가 있습니다.이 프로세스에서는 방금 종료 된 프로세스를 확인하기 위해 wait()
을 수행합니다. exe1
이 끝나면 종료 코드를 관찰하고 exe2
을 시작할지 여부를 결정합니다.
내 관심사는 어떻게 시작합니까 exe2
입니다. 내 SIGCHLD
처리기의 컨텍스트에서 내 jobManager 시작 함수를 사용하면 너무 많은 SIGCHLD
처리기 함수 (예를 들어, 10 조건부 실행 있었다면)에 놀고 결국 수도 결국 우려하고있다. 또한 간접적으로 발생하는 경우에도 신호 처리기에서 다음 실행을 시작하는 것이 좋지 않은 것처럼 보입니다. (1.5 년 전 신호 처리에 대해 배웠을 때 비슷한 것을 시도해 보았습니다.
위의 모든 내용이 백그라운드에서 발생할 수 있어야하며 jobManager
이 바쁜 대기 상태가되어 exe1
이 반환되기를 기다리는 것을 피하고 싶습니다. 또한 다른 프로세스의 실행을 시작하기 위해 대기하는 별도의 스레드가없는 것이 좋습니다. 그러나 내 jobManager
에게 SIGCHLD
처리기에서 다음 프로세스의 실행을 시작하도록 지시하는 것은 좋지 않은 코드처럼 보입니다.
모든 의견이 적합합니다.
아 - select() 솔루션은 나에게 매우 흥미 롭습니다. 나는 소켓 프로그래밍에서 select()/poll()을 사용했고 바쁜 대기를 피하기 위해 여기에서 비슷한 것을하기를 희망했다. 그러나 런타임시 신호 처리기에 아무 것도 제공 할 수 없기 때문에 파이프가 '전역'이어야한다고 생각합니다. – BSchlinker
sigwait 루프는 추악하며 배경 작업이 필요하기 때문에 여기서는별로 도움이되지 않습니다. – Robert
당신은이 전역 변수를 wihtout으로 처리 할 수 있습니다. 그러나 리눅스의 특별한 방법으로 : signalfd는 신호에 대한 정보를 얻는 기술자를 생성합니다. – fghj