Bash 매뉴얼에 따르면
/dev/fd
프로세스 대체는 명명된 파이프(fifo) 또는 명명된 파일 열기 방법을 지원하는 시스템에서 지원됩니다.
- 이는 프로세스 교체가 명명된 파이프나 아래 파일을 통해 이루어짐을 의미합니까
/dev/fd
? Linux에서 프로세스 교체는 어떻게 구현됩니까?
다음 예는 Linux에서 프로세스 교체가 명명된 파이프 대신 파일을 통해
/dev/fd
구현된다는 것을 의미합니까?$ echo <(cat) /dev/fd/63
에서는
command1 <(command2)
두 명령이 동시에 실행됩니까, 아니면 다른 명령 실행이 완료된 후 하나의 명령이 시작됩니까?프로세스 교체가 명명된 파이프를 통해 구현된다면 프로세스 교체 예제의 두 명령이 동시에 실행된다는 뜻인가요? 내 생각에는 파이프와 명명된 파이프가 동시에 실행되는 프로세스 간의 통신에 사용되고 파이프의 명령이 동시에 실행되기 때문인 것 같습니다.
답변의 파트 2를 이해하려고 노력하는 동안 이 문제가 발생했습니다. https://unix.stackexchange.com/a/286556/674.
감사해요.
답변1
strace
내 시스템 의 출력을 보면strace -v -f -s150 -o log bash -c 'echo <(cat)'
/dev/fd가 파이프로 구현되어 있습니다. 3, 4개의 fd가 있는 파이프를 생성한 다음 3을 63으로 복사합니다./dev/fd
그냥 심볼릭 링크입니다/proc/self/fd
. 내 시스템에/dev/fd
심볼릭 링크가 없으며 출력은/proc/self/fd/63
.Bash는 파이프로만 작동합니다. Bash 소스 코드에서는 다른 bash'ism처럼 에뮬레이션될 수 있는 것처럼 보이지만/dev/tcp
확실하지 않습니다. 그러나 나는 그런 것을 전혀 보지 못했습니다busybox ash
.echo
전체 bash를 내장 명령으로tty
바꾸면 먼저 실행된 다음 미리 로드된 파이프라인 fd를 사용하여 실행되는strace
것을 볼 수 있습니다 .tty
cat
답변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가 완료될 때까지 기다려야 함을 의미합니다. 그런 다음 절전 모드로 종료됩니다.
즉, 동시에 실행됩니다.