`
hanyh
  • 浏览: 227991 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

STDIN_FILENO的作用及与stdin 的区别(转)

 
阅读更多
STDIN_FILENO的作用及与stdin 的区别

原文地址http://blog.csdn.net/yeyuangen/article/details/6781999

1.STDIN_FILENO的作用
STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。
操作系统一级提供的文件API都是以文件描述符来表示文件。STDIN_FILENO就是标准输入设备的文件描述符。

2.区别
1)数据类型不一致:
stdin类型为 FILE*
STDIN_FILENO类型为 int
使用stdin的函数主要有:fread、fwrite、fclose等,基本上都以f开头
使用STDIN_FILENO的函数有:read、write、close等

2)stdin等是FILE *类型,属于标准I/O,高级的输入输出函数。在<stdio.h>。
STDIN_FILENO等是文件描述符,是非负整数,一般定义为0, 1, 2,属于没有buffer的I/O,直接调用系统调用,在<unistd.h>。

3)STDIN_FILENO 是标准输入的文件描述符
详见/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. */

4)层次不一样。STDIN 属于标准库处理的输入流,其声明为 FILE 型的,对应的函数前面都有f开头,如fopen/fread/fwrite/fclose 标准库调用等
STDIN_FILENO属于系统API接口库,其声明为 int 型,是一个打开文件句柄,对应的函数主要包括 open/read/write/close 等系统级调用。

标准库内封装了系统 API 调用,如 fread 内部实现调用 read。

5)操作系统一级提供的文件API都是以文件描述符来表示文件。STDIN_FILENO就是标准输入设备(一般是键盘)的文件描述符。

补充:
1,linux进程终止时,内核会关闭该进程的所有打开文件描述符
2,read,write的buffer大小对性能有影响,通常设置为文件系统的block_size大小。
3,read函数每次指定的大小不一定能获取指定数量的数据
4,write通过lseek写的空洞文件,通常不占用磁盘块,再具体写入的适合再分配(除非预先全部设置)


分享到:
评论

相关推荐

    第四次上机题目及参考代码.docx

    tcgetattr(STDIN_FILENO, &oldt;); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW,&newt;); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf |O_...

    Linux下 2048小游戏

    res=tcgetattr(STDIN_FILENO, &org;_opts); assert(res==0); //从新设置终端参数 memcpy(&new;_opts, &org;_opts, sizeof(new_opts)); new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ...

    C语言的isatty函数和ttyname函数以及sendmsg函数用法

    isatty()函数 头文件: #include 定义函数: int isatty(int desc); 函数说明:如果参数 desc 所代表的文件描述词为一终端机则返回1, 否则返回0. 返回值:如果文件为终端机则返回1, 否则返回0. ...

    采用swift实现的打砖块mac游戏

    源码mac swift console,main.swift 主要是做逻辑判断的,File.c 是处理键盘输入和获取光标位置 打砖块-Bridging-... select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv); return FD_ISSET(STDIN_FILENO, &rdfs); }

    在Python程序中操作文件之isatty()方法的使用教程

    主要介绍了在Python程序中操作文件之isatty()方法的使用教程,是Python入门学习中的基础知识,需要的朋友可以参考下

    详解Linux下的文件标述符和文件指针

    Linux下的文件标述符和文件指针 文件标识符: 首先我们来了解一下文件标识符是什么东西? 文件描述符是计算机科学中的一个术语,是一个用于表述只想文件的引用的抽象...STDIN_FILENO stdin 1 Standard output STDOUT_FI

    同步异步write的效率比较

    程序默认从标准输入STDIN_FILENO读取输入文件,可以利用shell的输入定向功能选择具体的输入文件。 系统调用times()的说明 #include clock_t times(struct tms *buf); struct tms { clock_t tms_utime; /* 记录...

    python实时检测键盘输入函数的示例

    在嵌入式、尤其是机器人的python编程中,经常需要... fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) ch = sys.stdin.read(1) finally: termios.tcsetatt

    tcp并发服务器代码

    dup2(f_des[0],STDIN_FILENO); close(f_des[0]); } execl(SHELL,"sh","-c",command,(char*)0); _exit(127); char *argv[] = {command,0}; if(execvp(command,argv)==-1) return NULL; } wait(0); if(type[0...

    libgfxd:显示列表反汇编程序库

    用法示例 示例源代码: #include #include static int macro_fn(void) { /* Print a tab before each macro, and a comma and ... gfxd_input_fd(fileno(stdin)); gfxd_output_fd(fileno(stdout)); /* Overr

    QT父子进程间通讯

    QT父子进程间通讯,父进程通过writeData发送数据,子进程通过读取标准输入获取数据。

Global site tag (gtag.js) - Google Analytics