[unix] bash는 C의 포크 ()와 유사한 포크를 지원합니까?

동일한 스크립트의 두 복사본이 실행되도록 한 지점에서 포크하려는 스크립트가 있습니다.

예를 들어 다음 bash 스크립트가 존재합니다.

echo $$
do_fork()
echo $$

이 bash 스크립트가 실제로 존재하면 예상되는 결과는 다음과 같습니다.

<ProcessA PID>
<ProcessB PID>
<ProcessA PID>

또는

<ProcessA PID>
<ProcessA PID>
<ProcessB PID>

“do_fork ()”대신 이런 종류의 출력을 얻거나 bash 스크립트가 C와 같은 포크를 수행하도록 할 수있는 것이 있습니까?



답변

예. 포크는 철자가 &:

echo child & echo parent

혼란 스러울 수있는 것은 $$쉘 프로세스의 PID가 아니라 원래 쉘 프로세스 의 PID입니다 . 이런 식으로 만드는 요점은 $$쉘 스크립트의 특정 인스턴스에 대한 고유 식별자라는 것입니다. 스크립트 실행 중에 변경되지 않으며 $$동시에 실행되는 다른 스크립트 와 다릅니다 . 쉘 프로세스의 실제 PID를 얻는 한 가지 방법은 sh -c 'echo $PPID'입니다.

셸의 제어 흐름은 C와 동일하지 않습니다. C에서 작성하는 경우

first(); fork(); second(); third();

쉘에 해당하는 것은

after_fork () { second; third; }
first; after_fork & after_fork

간단한 쉘 형태 first; child & parent는 일반적인 C 관용구에 해당합니다.

first(); if (fork()) parent(); else child();

&그리고 $$존재하는 모든 Bourne의 스타일 쉘과 (t) CSH이 방식으로 작동합니다. $PPIDorignal Bourne 쉘에는 없었지만 POSIX에는 있습니다 (따라서 ash, bash, ksh, zsh 등).


답변

예,이를 subshells 라고 합니다. 괄호 안의 셸 코드는 하위 셸 (포크)로 실행됩니다. 그러나 첫 번째 쉘은 일반적으로 자식이 완료되기를 기다립니다. &터미네이터를 사용하여 비 동기화 할 수 있습니다 . 다음과 같이 실제로 작동하는지 확인하십시오.

#!/bin/bash

(sleep 2; echo "subsh 1")&
echo "topsh"

$ bash subsh.sh


답변

이 작업을 수행하는 기본 배쉬 (또는 다른 일반적인 * nix 셸) 방법은 없습니다. 비동기 적으로 다른 것을 수행하는 분기 된 프로세스를 생성하는 방법은 많이 있지만, fork () 시스템 호출의 정확한 의미를 따르는 것은 없다고 생각합니다.

일반적인 접근 방식은 최상위 스크립트가 원하는 작업을 수행하는 도우미를 생성하는 것입니다. 당신이 $0 $@ &하거나 무엇이든간에, 당신은 처음부터 다시 시작하고 어떻게 든 알아낼 필요가 있습니다.

나는 실제로 그 일을 할 수있는 몇 가지 영리한 방법을 생각하기 시작했습니다 ….

그러나 , 내 두뇌가 너무 빠져 들기 전에 꽤 좋은 규칙이라고 생각합니다. 쉘로 무언가를 쓰려고 노력하고 영리한 트릭으로 가득 차 있고 더 많은 언어 기능을 원한다면 전환 할 시간입니다. 실제 프로그래밍 언어로 .


답변