프로세스 교체 구현 및 프로세스 교체 동시성 구현

프로세스 교체 구현 및 프로세스 교체 동시성 구현

Bash 매뉴얼에 따르면

/dev/fd프로세스 대체는 명명된 파이프(fifo) 또는 명명된 파일 열기 방법을 지원하는 시스템에서 지원됩니다.

  1. 이는 프로세스 교체가 명명된 파이프나 아래 파일을 통해 이루어짐을 의미합니까 /dev/fd?
  2. Linux에서 프로세스 교체는 어떻게 구현됩니까?

    다음 예는 Linux에서 프로세스 교체가 명명된 파이프 대신 파일을 통해 /dev/fd구현된다는 것을 의미합니까?

    $ echo <(cat)
    /dev/fd/63
    
  3. 에서는 command1 <(command2)두 명령이 동시에 실행됩니까, 아니면 다른 명령 실행이 완료된 후 하나의 명령이 시작됩니까?

    프로세스 교체가 명명된 파이프를 통해 구현된다면 프로세스 교체 예제의 두 명령이 동시에 실행된다는 뜻인가요? 내 생각에는 파이프와 명명된 파이프가 동시에 실행되는 프로세스 간의 통신에 사용되고 파이프의 명령이 동시에 실행되기 때문인 것 같습니다.

    답변의 파트 2를 이해하려고 노력하는 동안 이 문제가 발생했습니다. https://unix.stackexchange.com/a/286556/674.

감사해요.

답변1

  1. strace내 시스템 의 출력을 보면 strace -v -f -s150 -o log bash -c 'echo <(cat)'/dev/fd가 파이프로 구현되어 있습니다. 3, 4개의 fd가 있는 파이프를 생성한 다음 3을 63으로 복사합니다.
  2. /dev/fd그냥 심볼릭 링크입니다 /proc/self/fd. 내 시스템에 /dev/fd심볼릭 링크가 없으며 출력은 /proc/self/fd/63.Bash는 파이프로만 작동합니다. Bash 소스 코드에서는 다른 bash'ism처럼 에뮬레이션될 수 있는 것처럼 보이지만 /dev/tcp확실하지 않습니다. 그러나 나는 그런 것을 전혀 보지 못했습니다 busybox ash.
  3. echo전체 bash를 내장 명령으로 tty바꾸면 먼저 실행된 다음 미리 로드된 파이프라인 fd를 사용하여 실행되는 strace것을 볼 수 있습니다 .ttycat

답변2

1., 2.: 예, 프로세스 교체이는 명명된 파이프를 통해 달성됩니다.(오픈소스 = 소스코드를 읽을 수 있음)

삼.

프로세스 교체가 명명된 파이프를 통해 구현된다면 프로세스 교체 예제의 두 명령이 동시에 실행된다는 뜻인가요?

예, 이는 동시에 실행된다는 의미입니다.

답변3

포인트 3의 경우 다음을 정의하면:

$ d(){ printf '%7s %7s %s\n' "$BASHPID" "$1" $(date -u +'%H:%M:%S'); }
$ p1(){ d START; readarray -t a; printf '%s\n' "${a[@]}" ; sleep 2; d END; }
$ p2(){ d START; sleep 2; d END; }

그러면 다음과 같습니다.

$ p1 < <(p2)

다음을 인쇄합니다:

   8517   START 20:31:38
  11764   START 20:31:38
  11764     END 20:31:40
   8517     END 20:31:42

이는 둘 다 함께 시작하지만 p1은 읽기를 닫기 전에 p2가 완료될 때까지 기다려야 함을 의미합니다. 그런 다음 절전 모드로 종료됩니다.

즉, 동시에 실행됩니다.

관련 정보