표준 입력을 찾을 수 있는지 테스트할 때의 문제

표준 입력을 찾을 수 있는지 테스트할 때의 문제

의 진술을 뒤집었다 if/else가 지금 정정합니다.


다음 코드 조각을 읽고 있습니다.UNIX® 환경의 고급 프로그래밍:

프로그램은 표준 입력을 테스트하여 조회를 수행할 수 있는지 확인합니다.

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void){

    if(lseek(STDIN_FILENO,0, SEEK_CUR) == -1)
        printf("cannot seek\n");
    else{
        printf("seek ok\n");
    }
}

(아래에서) 컴파일하고 실행했지만 Ubuntu 18.04.2 LTS다음 동작을 이해하지 못합니다.

//1
$ ./a.out 
cannot seek

//2
$ ./a.out < /etc/passwd
seek OK

//3
$ cat < /etc/passwd | ./a.out
cannot seek

//4
$ ./a.out < /var/spool/cron/FIFO
cannot seek

//1?cannot seek 내 생각에는 소라가 stdin그것을 얻을 수 있을 것 같아요. stdin아직 오픈을 안해서 그런걸까요 ? 보통 그런 말 stdin을 들었고 프로그램이 실행되기 시작하면 열립니다 stdout.stderr

//2가능하고 왜 //3불가능합니까? 나는 그들이 같다고 생각합니다.

답변1

//1 ./a.out:

stdin을 리디렉션하지 않으면(파이프 없음 및 no <) stdin은 상위 프로세스에서 상속됩니다. 쉘에서 대화형으로 실행 하면 a.out키보드 입력을 stdin으로 가져오는 터미널 장치를 상속합니다.

터미널 장치는 일반적으로 사용자 상호 작용을 나타내기 때문에 검색할 수 없지만 POSIX 표준에 따르면 lseek성공을 반환하고 아무 작업도 수행하지 않을 수 있습니다. Linux에서 lseek디스플레이가 실패합니다 ESPIPE.

//2 ./a.out < /etc/passwd:

여기서 stdin은 열린 파일로 리디렉션됩니다. /etc/passwd일반 파일과 마찬가지로 검색이 가능합니다 .

//3 cat < /etc/passwd | ./a.out:

cat여기에서는 두 개의 프로세스( 및 ) 를 시작 ./a.out하고 이를 파이프로 연결합니다.

cat(다른 인수 없이) stdin( /etc/passwd)을 읽고 이를 stdout(연결된 파이프 ./a.out)에 복사합니다. 이것은 상황과 다릅니다 //2. 표준 입력의 관점에서 보면 ./a.out탐색은 다른 프로세스에 연결된 파이프일 뿐이므로 탐색을 수행할 수 있는 방법이 없습니다.

//4 ./a.out < /var/spool/cron/FIFO:

여기 당신은명명된 파이프또는 유사한 특수 파일. 이 경우도 비슷합니다 //3. 다른 프로세스에 대한 단방향 연결이 있습니다. 그리고 이것들은 발견되지 않습니다.

관련 정보