왜 일부 프로그램은 즉시 쉘로 돌아가고 다른 프로그램은 실행이 완료 될 때까지하지 않습니까?


13

I가에서 읽고 현대 운영 체제의 명령이 실행될 때, 쉘이 자식 프로세스를 생성하는 책, 아이가 완성 된 실행을 가지고 다음 사용자에서 다른 명령을 기다립니다 때까지 기다립니다. 이것은 실제로 같은 많은 프로그램의 경우입니다 gedit. 터미널은 내가 닫을 때까지 명령을받지 않습니다 gedit. 그러나 원자 코드 편집기를 열면 셸이 즉시 반환되어 편집기를 실행해도 다음 명령을 수락 할 수 있습니다. 터미널을 닫아도 원자가 닫히지 않습니다 . 이것은 편집자가 하위 프로세스로 열지 않았 음을 의미합니까? 이를 가능하게하는 기본 메커니즘은 무엇입니까?

달리기 ps au | grep atom제공

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom

1
atom 편집기를 시작한 후 ps au | grep atom터미널에서 실행 하여 질문에 출력을 추가 할 수 있습니까?
kirill-a

@ kirill-a 질문을 업데이트했습니다.
Aswin PJ

답변:


18

이 질문은 두 가지 유형의 프로그램에 대해 묻습니다.

  1. 쉘에서 사용자와 상호 작용하는 프로그램
  2. 쉘에서 사용자와 상호 작용 하지 않는 프로그램 .

첫 번째 경우, 셸에서 사용자와 상호 작용하는 프로그램은 셸로 제어를 반환하기 전에 완료 될 때까지 실행되도록 설계되었습니다. 특별한 것은 없습니다.

두 번째 경우는 더 복잡합니다. 일반적으로 프로그램은 포크 (메모리에 자신의 사본을 작성)하고 쉘의 제어 터미널 과의 연관을 제거하고 원래 쉘과 독립적으로 실행되는 다른 프로그램을 실행할 수 있습니다 . 두 번째 프로그램의 메시지가 표시 될 수도 있지만 일반적으로 사용자와 상호 작용하지는 않습니다. 사용 방법에 따라

  • 데몬 (서버) 프로세스 또는
  • 프로그램이 새 창에서 실행될 수 있습니다. 그래픽 편집자는 후자를 수행합니다.

더 읽을 거리 :


터미널에서 분기 및 연결 해제에 대한 부분은 종종 daemon이 모든 작업을 수행하는 라이브러리 함수를 호출하여 수행됩니다 .
kasperd

제어 터미널을 얻는 것을 피하기 위해 이중 포크가 사용됩니다
jfs

두 의견 모두 : POSIX에는 기능이 없으며 터미널 제어에 대해서는 알고 있지만 대답은 짧고 간단합니다. 1980 년대 후반부터 더블 포크를 사용했습니다.
Thomas Dickey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.