의 진술을 뒤집었다 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
. 다른 프로세스에 대한 단방향 연결이 있습니다. 그리고 이것들은 발견되지 않습니다.