2013-11-02 3 views
0

루프에서 포크가 발생하고 포크 위로 사용자의 입력을 요구합니다. 내 갈퀴 과정에는 인쇄도 있습니다. 프로세스가 실행될 순서에 대한 보장이 없으므로 사용자 프롬프트와 사용자가 정보를 입력 할 수있는 위치 사이에 하위 프로세스 인쇄 줄을 자주 (또는 항상) 얻을 수 있습니다.자식 프로세스의 일부가 완료 될 때까지 기다리시겠습니까?

즉, 나는 이런 식으로 뭔가를 얻을 :

Enter info: <OUTPUT FROM CHILD> 
_ 

(여기서 _ 사용자가 입력을 자유롭게 체결 할 수 있음을 나타냅니다.)

I가 내 부모 프로세스를 허용하는 것을 시도하고 있기 때문에 동시에 실행되는 여러 어린이 프로세스 (각 사용자가 제공 한 정보를 기반으로 처리)를 포크로 실행하면 부모 프로세스를 계속 진행하기 전에 자식 프로세스가 종료 될 때까지 기다릴 수 없습니다. 부모가 계속 진행하기 전에 자녀의 일부가 완료되기를 기다릴 수있는 방법이 있습니까?

+0

세마포어 사용을 고려해 보셨습니까? 그렇다면 왜 당신은 그 (것)들에 대하여 결정하고 당신은 그 외에 무엇을 시도 했습니까? – UnholySheep

+0

@ UnholySheep 나는 실제로했다. 나는 깃발을 세우려고 시도하고 부모가 자식에 의해 1로 설정 될 때까지 기다렸다가 (플래그가 1이 아닌 경우 계속), 두 번째 반복에서는 프로그램이 응답을 멈춘다. 플래그를 인쇄하여 변경되지 않았 음을 확인했습니다 (인쇄 0 유지). 그래서 어떤 이유에서인지, 부모를 실행하려고 시도하고, 부모에게 돌아 가기 전에 내가 좋아할 자식의 2 줄을하지 않을 것입니다. –

+0

그 코드가 아직 남아있는 경우 새로운 질문을 열어 볼 수 있습니다. 문제를 해결하는 데 도움이 될 것입니다. 나는 개인적으로 문제의 종류에 대한 세마포어를 사용하는 것이 더 좋은 선택이라고 생각할 수는 없지만, 아마도 다른 누군가가 당신을위한 해결책을 가지고있을 것입니다. – UnholySheep

답변

0

많은 것들은 실제 수행하려는 작업에 따라 다르지만, 프로세스 완료를 기다리는 동안 waitpid() 또는 wait()을 사용할 수 없습니다. 대기 함수 군은 죽은 프로세스 나 신호 (SIGSTOP, SIGTTIN, SIGTTOU 등)로 인해 중지 된 프로세스를 기다린다.

몇 가지 질문은 :

  • 는 자식 프로세스의 출력이 혼란에 이르게 화면으로 전송 될 경우, 또는이 파일로 전송해야 하는가?
  • 또는 프로그램이 각 하위의 파이프를 가지고있어 편리 할 때 하위의 출력을 읽고 화면의 적절한 부분에 표시 할 수 있습니까?
  • 또는 윈도우 환경에서 어린이 메시지를 다른 창 (예 : 콘솔 창)으로 보내야합니까?
  • 아니면 아이들이 syslog 데몬에 써야합니까?
  • 또는 자녀가 SIGTTOU 신호에 매달리게해야합니까?

많은 것들이 메시지의 목적과 메시지를 즉각적으로 표시하는 중요성에 달려 있습니다.

0

다른 답변은 분명 더 일반적이며이 문제를 해결하는 적절한 방법은 파이프와 관련이 있지만 실제로는 매우 간단하고 부모가 잠시 기다려야하므로 잠시 기다리십시오. usleep() 줄을 사용하여 자식이 인쇄를 마칠 때까지 몇 밀리 초를 기다립니다. 확실히 완벽하지는 않지만 효과적입니다.

관련 문제