한 하위 프로세스가 다른 하위 프로세스를 굶어 버리지 않게하려면 어떻게합니까?


10

분명히하기 위해, 나는 emacs가 멀티 스레드되어야하는 것에 대해 이야기하고 있지 않습니다 (아마도 이것을 해결할 것입니다). 재현하려면 :

  1. emacs -Q # 24.4.1을 실행 중입니다
  2. 두 번째 프레임 만들기
  3. 첫 번째 프레임으로 다시 전환
  4. MX 쉘
  5. Mx는 고유하게 이름을 바꿉니다 (나중에 두 번째 쉘을 만들 것입니다)
  6. 실행 시작 : while true; do echo "hello world"; done
  7. 두 번째 프레임에서 Mx shell

두 번째 쉘은 거의 표시되지 않습니다 (반복 시도 후에 는 거의 작동하지 않음). 분명히 emacs는 다른 프로세스에서 들어오는 출력을 듣기 위해 첫 번째 쉘의 출력을 읽는 것을 중단하지 않을 것입니다. 보류중인 출력을 가진 여러 프로세스가있을 때 로빈을 반올림하는 것이 훨씬 더 나은 동작입니다. 더 나은 행동을 취할 수있는 방법이 있습니까?

내가 아는 유일한 트릭은 쉘 버퍼를 자체 프로세스로 만드는 것이지만 불행히도 그것은 나를 위해 작동하지 않습니다. 그렇게해도, 음성 인식 소프트웨어가 작동하기 위해 소켓을 들으려면 서브 프로세스를 실행해야하므로 실제로 쉘을 처음부터 제어 할 수 있습니다. 위와 같이 무한 루프를 실행하면 데이터가 소켓에서 제거되지 않습니다.


1
귀하의 질문에 대한 구체적인 답변이 없습니다. 그러나 start-processa set-process-filter와 a 를 사용 하고 싶습니다 set-process-sentinel. 프로세스가 실행되는 동안 다른 작업을 수행 할 수있게 해줍니다. 내 에코 영역이 손상되지 않도록 때때로 출력을 *Messages*버퍼로 보냅니다. insert전용 프로세스 출력 버퍼 (필요한 경우) 예를 들어, 긴 rsync세션을 실행할 수 있습니다 . 나는 여러 개의 동시 / 긴 실행을 시도한 경험이 없으므로 start-processEmacs가 어떻게 진행되는지 잘 모르겠습니다.
lawlist

2
흠 흥미로운 발견. 두 쉘 모두 열등한 프로세스이며 Emacs는 여전히 주요 명령 루프를 문제없이 처리하고 있습니다. 그러나 열등한 FD를 폴링 할 때 항상 첫 번째 쉘에서 무언가를 발견하고 두 번째 FD를 처리하지 못합니다. 첫 번째 쉘에서 while [1]을 죽이면 두 번째 쉘은 예상대로 나타납니다. 이것은 아마도 dev 메일 링리스트에 대한 질문 일 것입니다.
stsquad

나는 또 다른 문제가 있지만 프레임에 익숙하지 않다 : lists.gnu.org/archive/html/bug-gnu-emacs/2015-10/msg01084.html
ReneFroger

답변:


2

따라서 이것은 올바른 해결책은 아니지만 다른 방법으로 테스트를 실행했습니다 (예 : 두 번째 쉘의 while [1]). 임시 해결책으로 많은 출력을 생성 할 가능성이있는 쉘 버퍼가 상호 작용을 원하는 것보다 나중에 작성되도록 할 수 있습니다. 그렇게하면 대화식 쉘이 많은 출력을 생성하는 쉘을 최종적으로 처리하기 전에 Emacs의 열등한 폴링에 의해 가장 먼저 처리됩니다.

실제로 선택한 대화식 쉘을 실행하는 경우 I / O가 오래 걸리는 상황이 아닐 수 있습니다. 정기적으로 그러한 것이 필요할 경우 출력을 파일로 리디렉션하고보기 모드를 사용하는 것이 더 나은 솔루션입니까?


1
여기서 문제는 우연히 무한 루프를 작성하는 것이 어렵지 않다는 것입니다. 또한 명령을 실행할 때 얼마나 많은 I / OI를 수행 할 것인지에 대해 생각할 필요가 없습니다. 이맥스를 사용하는 전체 장점은 모든 것이 좋은 이미 :) 저장-수 버퍼 점이다
요셉 가빈

1
@JosephGarvin 감사합니다. 훌륭한 재현기로 Mx report-bug를 사용하는 것이 가장 좋은 해결책이라고 생각합니다.
stsquad
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.