2017-10-24 1 views
0

실제로는 bash 스크립트에서 자식 프로세스로 실행되는 Scala REPL입니다.trap ctrl-c, 함수를 실행하지만 하위 프로세스를 종료하지 않습니까?

나는 ctrl-c가하는 것을 바꾸고 싶지만, 그렇지 않으면 scala REPL을 방해하지 않는다. 흥미롭게도 신호를 무시하면 trap '' SIGINT이 작동합니다. ctrl - C는 내 REPL을 죽일 수는 없지만 실제로 함수를 첨부하면 프로세스가 종료되지 못하게됩니다.

어떤 옵션이 있습니까? scala REPL은 전경에 있어야합니다. ctrl_c_handler가 백그라운드 프로세스를 시작하는 것이 좋습니다.

+1

'ctrl_c_handler()'의 끝 부분에 넣을 수있는 커맨드 셋을 만들기 전에 정말로 똑똑한 "점프 지점으로 돌아 가기"않는 한 이것이 가능하지 않다고 생각합니다. – Mort

답변

1

서브 프로세스가 터미널의 포 그라운드 프로세스 그룹의 유일한 구성원이기 때문에 배쉬는 터미널 프로세스가 시작되면 터미널 입력과 터미널에서 생성 된 신호 (예 : SIGINT)를 보지 못합니다. 하위 프로세스가 종료되면 Bash는 터미널을 다시 보게됩니다.

bash에서 SIGINT를 무시하면 서브 프로세스가 시그널 핸들러가 할당되지 않은 신호의 처리를 상속하기 때문에 작동합니다.

stty을 사용하여 SIGINT를 다른 키보드 기호 (또는 키보드 기호 없음)에 재 할당 할 수 있습니다. 하위 프로세스는 해당 설정을 상속받습니다. 이렇게하면 ctrl-C가 일반 문자가되어 하위 프로세스가 중단되지 않습니다. 불행히도, 그것은 bash도 방해하지 않을 것입니다, 그래서 그것은 정말로 해결책이 아닙니다.

pseudoterminal (pty)을 만들고 pseudo-tty의 슬레이브 끝 부분에 하위 프로세스를 연결하여 더 많은 제어 권한을 부여하는 하위 프로세스를 만들 수 있습니다. 그런 다음, pty의 마스터쪽에 데이터를 쓰고 터미널에서 읽은 입력을 전달할 수 있으며, 마스터 쪽에서 읽은 다음 터미널에 쓰면 서브 프로세스의 출력을 터미널에 다시 전달할 수 있습니다. 이 구성에서는 마스터 프로세스에서 SIGINT를 트랩하고 서브 프로세스로 전달하지 않을 수 있습니다. 그러나 시스템 기능에 대한 액세스를 제공하는 언어 (반드시 C는 아님)로 작성해야합니다. 그것은 bash에서 가능할 수도 있지만 꽤 해킹 될 것입니다. 시작 위치에 대한 자세한 내용은 man pty을 참조하십시오.

+0

의미가 있습니다. 나는 원숭이가 REPL을 내면에서 패치하는 방법을 찾았지만, 정말 어둡다. REPL 자체를 커스터마이징하는 것은 테이블에서 거의 벗어났습니다 (사실 스파크 셸 이었기 때문에 모든면에서 거북이였습니다). REPL 프로세스에 선택적으로 입력을 전달하는 레이어를 명시 적으로 배치하는 것이 가장 좋은 방법이라고 생각합니다. 나는 pty를 조사 할 것이다. –

관련 문제