我正在閱讀 APUE(UNIX 環境中的高級編程)3e。
并且有一個示例代碼來解釋如何fcntl()作業,如下所示。
(我改變了一些包含的頭檔案和部分代碼,使其獨立于本書的庫。為了讓代碼只依賴于標準庫。)
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int val;
if (argc != 2) {
fprintf(stderr, "usage: %s <descriptor#>\n", argv[0]);
exit(1);
}
if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) {
perror("fcntl error for fd");
exit(1);
}
switch (val & O_ACCMODE) {
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
fprintf(stderr, "unknown access mode\n");
//exit(1);
}
if (val & O_APPEND)
printf(", append");
if (val & O_NONBLOCK)
printf(", nonblocking");
if (val & O_SYNC)
printf(", synchronous writes");
#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) && (O_FSYNC != O_SYNC)
if (val & O_FSYNC)
printf(", synchronous writes");
#endif
putchar('\n');
exit(0);
}
在基于此代碼制作二進制檔案后,這本書(85 頁)給出了一些示例來測驗檔案狀態標志,從給定的檔案描述符作為引數。其中之一就像以下。
$ ./a.out 0 < /dev/tty
結果是
read only
但是我對上面的重定向運算子有些好奇的地方是:0作為程式的單個命令引數給出,它只使用argv[1]其他任何東西。
那么,如何將重定向/dev/tty傳遞給程式呢?
在上面的命令列中是否/dev/tty覆寫了引數0或其他內容?
uj5u.com熱心網友回復:
如何重定向
/dev/tty到程式?
它不是。<并且/dev/tty不作為引數傳遞;他們告訴外殼重定向孩子的標準輸入(fd 0)。
外殼做了類似的事情
pid_t pid = fork();
if ( pid == 0 ) {
int for_stdin = open( "/dev/tty", O_RDONLY );
dup2( for_stdin, 0 );
close( for_stdin );
execlp( "./a.out", "0", NULL );
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/514447.html
