對stdin,stdout 和STDOUT_FILENO,STDIN_FILENO的學習

2puT發表於2016-07-21

在unix系統呼叫中,標準輸入描述字用stdin,標準輸出用stdout,標準出錯用stderr表示,但在一些呼叫函式,引用了STDIN_FILENO表示標準輸入才,同樣,標準出入用STDOUT_FILENO,標準出錯用STDERR_FILENO.
他們的區別:
stdin等是FILE *型別,屬於標準I/O,在<stdio.h>。
STDIN_FILENO等是檔案描述符,是非負整數,一般定義為0, 1, 2,屬於沒有buffer的I/O,直接呼叫系統呼叫,在<unistd.h>。

下面一個例子是對STDOUT_FIFENO 和STDIN_FILENO的應用:

#include<unistd.h>
#define SIZE 100


int main(void)
{
        int n;
        char buf[SIZE];


        while(n=read(STDIN_FILENO,buf,SIZE))   //讀取標準輸入到buf中,返回讀取位元組數。
      {
                if(n!=write(STDOUT_FILENO,buf,n)) 把buf 寫到標準輸出中
                        perror("write error");
        }
        if(n<0) perror("read error");  
        return 0;
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
如果按照常規的使用方法:
fan@fan:~/arm$ gcc -o app stdout.c
fan@fan:~/arm$ ./app
fdfe
fdfe
fefefef
fefefef
//輸入一行,馬上輸出一行,也就是按照原樣輸出
===========================================================================
使用重定向來執行
fan@fan:~/arm$ ./app> data
fefe
fdadfdf
adfdfef
//輸入的字串並不是輸出到終端,而是輸出到data檔案中。
==========================================================================
fan@fan:~/arm$ ./app <stdout.c >data
fan@fan:~/arm$
//這一句相當於把stdout.c複製到data中去
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDOUT_FILENO和STDIN_FILENO在預設的情況下是終端,
使用ctrl+D來輸入檔案結束符


本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/xiaoxi2xin/archive/2010/04/24/5524769.aspx

相關文章