C 프로그램의 출력을 /dev/tty에서 /dev/null로 리디렉션하는 방법은 무엇입니까?

C 프로그램의 출력을 /dev/tty에서 /dev/null로 리디렉션하는 방법은 무엇입니까?

/dev/tty쓰기를 방지하기 위한 명령줄 옵션이 없는 다음 C 프로그램 예를 생각해 보세요 .

#include <stdio.h>

int main (void) {
    FILE* fout = fopen("/dev/tty", "w");
    fprintf(fout, "Hello, World!\n");
    fclose(fout);
}

출력을 /dev/null쉘 스크립트로 어떻게 리디렉션할 수 있나요?

PS 나는 읽었다이 답변, 하지만 잘 이해가 안 돼요. 아무튼 프로그램 코드 소스를 수정하지 않는 답변을 찾고 있습니다.

답변1

TL, 박사:

script -c myprogram /dev/null </dev/null >/dev/null

/dev/tty표준 출력을 리디렉션하는 것과 같은 방식으로 "리디렉션"할 수 없습니다. 표준 출력은 파일 설명자로 정의됩니다. 파일 설명자 1에 이미 열려 있는 모든 파일은 프로그램이 시작될 때 기록됩니다. 일부 운영 체제는 표준 출력과 동등한 파일을 제공 /dev/stdout하지만 이는 표준 출력의 "별칭"입니다. 대신 /dev/tty프로세스의 제어 터미널을 나타내는 파일 이름입니다. 프로그램이 열려 있으면 /dev/tty명시적으로 열리고 /dev/tty리디렉션될 수 없습니다.

당신이 할 수 있는 일은 실행 중인 프로그램의 제어 터미널이 아닌 다른 제어 터미널을 사용하여 프로그램을 실행하는 것입니다. 이를 수행하는 쉬운 방법은 다음을 사용하는 것입니다.script주문하다. 가장 간단한 형태:

script -c myprogram /dev/null >/dev/null

실행 myprogram하고 열면 /dev/tty이는 script실행된 터미널이 아니라 제공된 터미널입니다 script. script터미널에서 쓰기를 감지하면 자체 표준 출력과 지정된 TypeScript 파일 모두에 쓰는 작업을 수행하므로 script표준 출력과 TypeScript 파일을 모두 /dev/null.

myprogram터미널에서 읽는 경우 자체 표준 입력에서 읽으므로 script이를 터미널로 리디렉션하는 것이 좋습니다./dev/null

script종료 상태는 호출자에게 전달되지 않습니다 myprogram. 데비안 및 그 파생물과 같은 일부 구현에서는 -e이를 수행하도록 선택할 수 있습니다.

답변2

그것은매우프로그램이 스스로 /dev/tty를 여는 것은 드문 일입니다. 콘솔에 무언가를 인쇄해야 하는 경우 stdout에 쓸 수 있으며 stdout아래와 같이 리디렉션할 수 있습니다.질 쇼.

여기서 유일한 선택은 가로채는 것입니다도서관 fopen인라인 처리되거나(흔하지 않은 일임) 기본 운영 체제가 open이를 호출하여 구부리지 않는 한 호출합니다.

어렵지 않습니다. 해당 함수를 포함하는 작은 라이브러리를 작성해야 합니다 open. 이 라이브러리는 입력을 "위생 처리"한 후 실제 함수를 호출합니다 open(즉, 파일 이름이 /dev/tty인 경우 /dev/null로 바꿉니다).

프로그램을 실행하고 시스템 호출을 가로채서 리디렉션합니다.이것이 어떻게 이루어지는지 보여줍니다.

관련 정보