사용자 입력을 반영하는 셸에서 실행되는 프로세스가 있다고 가정해 보겠습니다. 그렇다면 다른 터미널에서 이 쉘로 데이터를 어떻게 전달합니까? 중간 파일을 사용하지 않는 것이 가능한가요?
예를 들어, 코드가 있다면
fgets(string, LEN, stdin);
printf("%s", string);
그렇다면 다른 쉘에 데이터를 전달하고 다른 쉘 stdin
에서 데이터를 얻는 것이 가능합니까?stdout
답변1
하지만 무슨 뜻인지 잘 모르겠습니다.
단일 셸 세션(터미널) 내에서 다음과 같이 파이프를 사용하여 한 명령에서 다른 명령으로 데이터를 전달할 수 있습니다.
$ ls -l | grep something
두 개의 다른 셸 간에 이 작업을 수행해야 하는 경우 명명된 파이프를 사용할 수 있습니다.
tty1$ mkfifo /tmp/mypipe
tty1$ ls -l > /tmp/mypipe
tty2$ grep something < /tmp/mypipe
mktemp
명명된 파이프를 배치할 디렉터리를 만드는 것이 더 안전합니다.
tty1$ dir=$(mktemp -d)
tty1$ mkfifo "$dir/mypipe"
tty1$ ls -l > "$dir/mypipe"
tty1$ rm -r "$dir"
이를 위해서는 경로를 다른 창으로 복사해야 하지만 아마도 수동일 것입니다.
물론 명명된 파이프는 경로 이름이 필요하다는 점에서 중간 파일과 약간 유사하게 작동합니다. 그러나 데이터가 영구 저장소에 기록되지 않고 기록기가 느린 경우 판독기가 잠재적으로 조기에 파일이 끝나는 대신 기록기를 기다린다는 점에서 파이프처럼 작동합니다.
ls -l *something*
( 대신 일반적으로 를 사용 ls | grep
하지만 이는 예시로 사용됩니다.)
답변2
@ilkkachu의 답변이 도움이 되고 필요한 것을 제공한다고 생각합니다. 좀 더 자세하게 설명하면서 동시에 fifo 사용법도 배워보도록 하겠습니다.
동일한 컴퓨터에 두 개의 명령줄 창 w1 및 w2 준비
리스너를 생성하기 위해
program
w1에서 쉘스크립트를 만들었습니다.#!/bin/bash while true do read string if [ "${string:0:4}" == "Stop" ] then printf "Gotcha\n" break elif [ "$string" != "" ] then printf "$string " else sleep 3 fi done
w1에서 fifo 준비
dir=$(mktemp -d) mkfifo "$dir/mypipe"
프로그램을 시작하고 w1의 fifo로부터 입력을 기다리도록 합니다.
< "$dir/mypipe" ./program
fifo를 찾아 w2에서 일부 문자열을 에코합니다.
$ find /tmp -name mypipe 2>/dev/null /tmp/tmp.dRhpqajJqz/mypipe $ > '/tmp/tmp.dRhpqajJqz/mypipe' echo qwerty $ > '/tmp/tmp.dRhpqajJqz/mypipe' echo asdf $ > '/tmp/tmp.dRhpqajJqz/mypipe' echo Stopp
w1에서 출력 보기
qwerty asdf Gotcha $
예를 들어 아래와 같이 보다 자동화되도록 만들 수도 있습니다. 여기서는 이름이 임시 파일인 것으로 가정합니다 mypipe
.
w1에서 프로그램을 다시 시작하세요.
< "$dir/mypipe" ./program
w2에서
> $(find /tmp -name mypipe 2>/dev/null) echo 'Hello World' > $(find /tmp -name mypipe 2>/dev/null) echo 'Stop the World'
w1에서 출력 보기
Hello World Gotcha $
데모 C 프로그램,
#include <stdio.h>
#include <string.h>
int main () {
char string[21];
while(1){
fgets(string, 20, stdin);
string[strlen(string)-1] = 0;
if(strcmp("Stop", string) == 0){
printf("Gotcha");
return 1;
}
}
}
이 C 프로그램은 읽기가 "중지"되었을 때만 씁니다.