답변:
이 가정 프로그램은 지정한 파일 설명자 번호에 씁니다. 다음 hello world 프로그램을 고려하십시오.
#include <stdio.h>
main()
{
ssize_t i = 0 ;
printf ("hello world\n") ;
i = write( 5 , "Bonjour Monde\n", 14 ) ;
printf ("%d octet dans 5\n", (int) i) ;
}
그것을 컴파일
me@mybox:~/tmp7$ make hw
cc hw.c -o hw
이제 간단한 실행
me@mybox:~/tmp7$ ./hw
hello world
-1 octet dans 5
5에 대한 파일이 없으므로 쓴 바이트가 없습니다.
다음 시도 :
me@mybox:~/tmp7$ ./hw 5> u
hello world
14 octet dans 5
me@mybox:~/tmp7$ cat u
Bonjour Monde
파일과 파일 설명자를 지정하는 동안 출력을 얻을 수 있습니다 (예 :) 5>u
.
실제로 위와 같은 재미있는 프로그램을 작성하지 않은 경우을 사용하여 데이터를 수집 할 가능성이 없습니다 5>foo
.
쉘 스크립트에서 <()를 사용하는 구문이 더 유용합니다.
diff <( cmd -par 1 ) <(cmd -par 2)
write()
ssize_t
아닌을 반환합니다 int
.
이 숫자는 파일 설명자 입니다. 언급했듯이 자동으로 생성되는 것이 몇 가지 있습니다. 다른 파일이나 파일과 같은 것들이 열리면 다른 숫자를 얻습니다.
특정 프로그램에서 사용되는 숫자는 해당 프로그램에서 열거 나 사용 된 파일에 따라 다릅니다. 예를 들어, 현재 stdin을 "저장"하고 stdin을 다른 곳에서 일시적으로 리디렉션 한 후 나중에 복원하려면 다음과 같이 할 수 있습니다.
exec 4<&0
exec < /some/file
#process
exec 0<&4 4<&- # restore stdin and close our duplicate
따라서이 스크립트는 4
최소한 한동안 파일 디스크립터를 사용할 수 있습니다. 그 4는 사용하지 않는 것이 될 수 있습니다.
프로세스에서 어떤 파일 디스크립터를 열 었는지, 그리고 어디에서 파일 디스크립터를 열 었는지 확인할 수 있습니다 /proc/<pid>/fd
. 해당 프로세스에 대해 열려있는 모든 파일 디스크립터 <pid>
와 해당 파일과 연관된 파일이 표시됩니다.
모든 프로세스는 정수를 파일 디스크립터로 가져옵니다. POSIX에는 3 개의 예약 된 프로세스가 있습니다. 0은 stdin, 1은 stdout, 2는 stderr입니다. 추가 파일에는 추가 번호가 할당됩니다. 이 프로그램으로 쉽게 확인할 수 있고 fdtest.c 로 저장하여 런타임 중에 자체 프로그램 코드를 열 수 있습니다.
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
int fd = open("fdtest.c", O_RDONLY);
printf("%d\n", fd);
close(fd);
return 0;
}
그것을 컴파일하십시오 :
gcc fdtest.c -o fdtest
그것을 실행 :
./fdtest
얻을 수있는 출력은 다음과 같습니다.
3
... 변수에 의해 참조되는 파일의 파일 디스크립터 번호입니다 fd
.