54

stdinC和C之间的实际区别是什么(如果有的话)STDIN_FILENO

4

5 回答 5

59

界面。就像其他人所说stdin的那样,是FILE *标准c库定义的。您可以使用一些更高级别的接口,例如freadfwritefprintf。另一方面,STDIN_FILENO只是一个文件描述符(几乎可以肯定是0)。read这通过和之类的使用了一个稍低级别的接口write

于 2013-02-27T02:54:29.677 回答
22

stdin是一个默认的 FILE 指针,用于从标准输入中获取输入。

STDIN_FILENO是默认的标准输入文件描述符编号,即0. 它本质上是一个已定义的通用指令。

于 2013-02-27T02:16:22.113 回答
11

/usr/include/stdio.h,

/* Standard streams.  */
extern struct _IO_FILE *stdin;          /* Standard input stream.  */
extern struct _IO_FILE *stdout;         /* Standard output stream.  */
extern struct _IO_FILE *stderr;         /* Standard error output stream.  */
/* C89/C99 say they're macros.  Make them happy.  */
#define stdin stdin
#define stdout stdout
#define stderr stderr

/usr/include/unistd.h

/* Standard file descriptors.  */
#define STDIN_FILENO    0       /* Standard input.  */
#define STDOUT_FILENO   1       /* Standard output.  */
#define STDERR_FILENO   2       /* Standard error output.  */

例如,stdin_IO_FILE定义在/usr/include/libio.h)是一个结构数据。STDIN_FILENO是一个宏常量,它指向内核使用的文件描述符。

#include <stdio.h>
#include <unistd.h>

void
stdin_VS_STDIN_FILENO(void)
{
    printf("stdin->_flags = %hd\n", stdin->_flags);
    printf("STDIN_FILENO  : %d\n", STDIN_FILENO);
}

int
main(void)
{
    stdin_VS_STDIN_FILENO();
    return 0;
}
于 2017-10-09T02:51:46.167 回答
1

标准输入: 1. 文件指针 (* FILE) 2. 文件描述符表在进程创建时保存其地址。3. 存在于 /usr/include/stdio.h

STDIN_FILENO : 1. 它是一个宏 2. 它只不过是文件描述符表的数组索引(默认为 0)。3.存在于/usr/include/unistd.h

通过以下代码可以更清楚。

#include<stdio.h> 
#include<unistd.h> 
int main() 
{    
     printf("%d\t\t%p ----- ",STDIN_FILENO,stdin);

return 0; 
} 
于 2019-11-10T17:47:49.193 回答
0

当您使用 Linux 管道时,Linux 标头 #include "unistd.h" 中的 STDIN_FILENO 只是 0 的宏,它代表管道的标准输入。

于 2021-06-30T14:26:52.200 回答