mkfifo 파이프, 파일 설명자 및 ImageMagick(변환)

mkfifo 파이프, 파일 설명자 및 ImageMagick(변환)

ImageMagick() 에서 출력을 리디렉션하고 입력을 가져오기 위해 명명된 파이프(예: 생성 사용)와 파일 설명자를 사용하는 데 mkfifo문제가 있습니다 .convert

기본적으로 다음 bash코드(내가 시도하는 코드와 더 간단함)를 사용하면 스크립트가 중단되고 이미지가 표시되지 않습니다.

#!/bin/bash
mkfifo myPipe                              # Create a named pipe
exec 3<>myPipe                             # I/O file descriptor using the pipe
convert rose: -resize 640x480\! png:fd:3   # Write the image to the pipe
convert png:fd:3 win:                      # To read from the pipe using the file descriptor
exec 3>&-                                  # Close the file descriptor
rm myPipe                                  # Close and remove the pipe

좀 조사해서 봤어여기이 단락(Jonathan Leffler의 답변에서 발췌):

FIFO가 읽기 위해 열리면 일반적으로 호출 프로세스가 차단됩니다. 프로세스가 쓰기를 위해 FIFO를 열면 판독기가 차단 해제됩니다. 작성자가 FIFO를 닫으면 읽기 프로세스는 EOF(읽을 수 있는 바이트 수)를 얻고 FIFO를 닫았다가 다시 여는 것 외에는 아무 작업도 수행하지 않습니다.

이를 방지하기 위해 다음 지침(답변에서 가져온 코드)이 포함된 Mark Edgar의 솔루션을 사용해 보았습니다.

# Create pipe and start reader.
mkfifo pipe
cat pipe &
# Open pipe for writing.
exec 3>pipe
echo one >&3
echo two >&3
# Close pipe.
exec 3>&-

불행하게도 파이프에서 읽고 파일 설명자를 사용하여(예: 를 fd:X사용하여 convert) 써야 합니다. 정지 문제 없이 이를 달성하려면 어떻게 해야 합니까?

답변1

문제는 그런데

exec 3<>myPipe

교착 상태를 방지하려면 FIFO의 R 끝과 W 끝을 동시에 엽니다.

convert rose: -resize 640x480\! png:fd:3

다음 명령이 실행되기 전에 완료되어야 하는 일반/전경 명령입니다. 잠재적으로 많은 양의 데이터를 FIFO에 쓰기 때문에 완료되지는 않지만 FIFO 버퍼가 가득 차면 차단되어 스크립트 교착 상태가 발생합니다.

이런 일이 발생하지 않도록 하려면 다음 프로세스가 그 동안 FIFO를 비워서 FIFO가 채워지는 것을 방지할 수 있도록 이 명령을 백그라운드에 두어야 합니다.

댓글에서 언급했듯이 이 경우 명명된 파이프 대신 일반 파이프를 사용하는 것이 좋습니다.

convert rose: -resize 640x480\! png:fd:1 | 
   convert png:fd:0 win:

코드 줄이 너무 길어지는 것이 걱정 된다면 가독성을 높이기 위해 줄을 연속 마무리하여\줄로||&&|

관련 정보