ksh93은 명령 대체에서 포크를 어떻게 피합니까?


12

주어진

cmd='fun(){ echo "$@";  }; fun $(fun $(fun hi))'

포탄은 그것을하기 위해 2 개의 포크를 만들어야하는 경향이 있습니다.

strace-f(){ strace -f "$@" 2>&1; }; 
for sh in dash bash zsh ksh; do 
    printf "$sh\t" ; strace-f $sh -c "$cmd"  |grep -e clone -e fork -c;
done

ksh영웅적으로 제외 하면 한 번만 포크하지 않고 만듭니다.

dash    2
bash    2
zsh     2
ksh     0

어떻게합니까?


편집하다:

던져진 파이프로 내려가는 방법은 다음과 같습니다.

cmd='fun(){ echo "$@"| echo "$@";  }; fun $(fun $(fun hi))'

산출:

dash    11
bash    10
zsh     5
ksh     3 

실패하지만 전체 파이프 라인에 대해서는 이것을 관리하지 않습니다. 전체 파이프 라인에서이를 가능하게하고 다른 쉘로 가져와야합니다.
PSkocik 2016 년

3
위생 검사를 위해 ksh설치 했습니까? 코드를 실행할 때 0설치하지 않은 쉘을 얻 습니다.
Eric Renouf

1
@EricRenouf Lol, 그렇습니다. 그리고 그것은 또한 일을합니다. ;)
PSkocik 2016 년

응답자는 stackoverflow.com/questions/14686872 를 읽을 수 있습니다 .
JdeBP

답변:


13

Ksh93은 포크를 피하기 위해 많은 일을합니다. 첫 번째 사례를 처리하는 방법을 아는 방법이 없습니다 . 최종 결과와 함께 truss한 번의 write(2)호출 만 호출한다는 것을 알 수 있습니다.

David가 macro.c에서 명령을 스캔하고 "echo"를 내부적으로 처리 할 수 ​​있음을 알고있을 수 있습니다.

내가 말할 수있는 것은 작년에 "Bourne Shell"의 파서와 인터프리터를 재 작성했으며 주로 포크 수를 줄이고 많은 포크를 vfork()호출 로 대체했다는 것 입니다. 이것은 현재 Bourne Shell을 ksh93에 이어 두 번째로 빠른 쉘로 만듭니다. 테스트도 함께 수행 할 수 있습니다 bosh.

BTW : ksh93은 일반적으로 포크를 피합니다. 이전의 모든 전역 변수를 포함하는 구조를 구현하며 "전역"변수 구조 포인터의 다른 인스턴스와 함께 호출 될 경우 쉘 코드를 재진입 할 ​​수 있습니다.

이 방법은 (cmd)서브 쉘 이있을 때마다 ksh93에 의해 사용됩니다 .

이 재 작성의 이유는 David가 랩톱에서 Win-DOS를 사용하고 있으며 느린 Cygwin을 좋아하지 않았기 때문에 UWIN을 작성하고 Win-DOS에서 ksh93을 직접 사용하기 때문입니다. fork()Win-DOS 가 없기 때문에 새로운 솔루션을 찾아야했습니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.