apue讀書筆記【五】:文件IO(1) fileno open read write

一、文件描述符

函數名稱:fileno

函數原型:int _fileno( FILE *stream );  

函數功能:用來取得指定的文件流所使用的文件描述符  

返回值:某個數據流的文件句柄  

頭文件:stdio.h

demo:

#include <stdio.h>
int main(){

        printf("the file descriptor for stdin is %d\n",fileno(stdin));
	printf("the file descriptor for stdout is %d\n",fileno(stdout));
	printf("the file descriptor for stderr is %d\n",fileno(stderr));

	return 0;
}

二、open函數

函數名稱:open

函數原型:int open(const char *pathname, int flags);
                  int open(const char *pathname, int flags, mode_t mode);

函數功能:打開或創建一個文件

返回值:   成功則返回文件描述符,否則返回 -1.(open返回的文件描述符一定是最小的未被使用的描述符。)

頭文件:#include <sys/types.h>
                #include <sys/stat.h>
                #include <fcntl.h>

參數:1、pathname 是要打開或創建文件的名字

            2、oflag用於指定文件的打開/創建模式,這個參數可由以下常量(定義於 fcntl.h)通過邏輯或構成。

             oflag的值:

               打開/創建文件時,至少得使用下述三個常量中的一個:

                     O_RDONLY     只讀模式
                     O_WRONLY 
    只寫模式
                     O_RDWR 
         讀寫模式
                         以下常量是選用的:

                     O_APPEND          每次寫操作都寫入文件的末尾
                     O_CREAT 
            如果指定文件不存在,則創建這個文件
                     O_EXCL 
              如果要創建的文件已存在,則返回 -1,並且修改 errno 的值
                     O_TRUNC 
            如果文件存在,並且以只寫/讀寫方式打開,則清空文件全部內容
                     O_NOCTTY 
        如果路徑名指向終端設備,不要把這個設備用作控制終端。
                     O_NONBLOCK 
   如果路徑名指向 FIFO/塊文件/字符文件,則把文件的打開和後繼I/O設置爲非阻塞模式(nonblocking mode)

                          以下三個常量同樣是選用的,它們用於同步輸入輸出:

                     O_DSYNC       等待物理 I/O 結束後再 write。在不影響讀取新寫入的數據的前提下,不等待文件屬性更新。
                     O_RSYNC 
      read 等待所有寫入同一區域的寫操作完成後再進行
                     O_SYNC 
        等待物理 I/O 結束後再 write,包括更新文件屬性的 I/O

                     3、mode則有下列數種組合,只有在建立新文件時纔會生效,此外真正建文件時的權限會受到umask值所影響,因此該文件權限應該爲(mode-umaks).返回值 若所有欲覈查的權限都通過了檢查則返回0 值, 表示成功,只要有一個權限被禁止則返回-1。


                      S_IRWXU                           00700 權限,代表該文件所有者具有可讀、可寫及可執行的權限。
                      S_IRUSR S_IREAD,   00400權限,代表該文件所有者具有可讀取的權限。
                      S_IWUSRS_IWRITE,00200 權限,代表該文件所有者具有可寫入的權限。
                      S_IXUSRS_IEXEC,   00100 權限,代表該文件所有者具有可執行的權限。
                      S_IRWXG                           00070權限,代表該文件用戶組具有可讀、可寫及可執行的權限。
                      S_IRGRP                             00040 權限,代表該文件用戶組具有可讀的權限。
                      S_IWGRP                            00020權限,代表該文件用戶組具有可寫入的權限。
                      S_IXGRP                             00010 權限,代表該文件用戶組具有可執行的權限。
                      S_IRWXO                            00007權限,代表其他用戶具有可讀、可寫及可執行的權限。
                      S_IROTH                             00004 權限,代表其他用戶具有可讀的權限
                      S_IWOTH                            00002權限,代表其他用戶具有可寫入的權限。
                      S_IXOTH                             00001 權限,代表其他用戶具有可執行的權限。
demo:

           

#include <unistd.h>
#include <sys/types.h>   /*for open*/
#include <sys/stat.h>    /*for open*/
#include <fcntl.h>       /*for open*/

#include <stdlib.h>      /*for perror exit */
#include <stdio.h>       /*for perror*/



#define ERR_EXIT(m) \
	do \
	{ \
		perror(m); \
		exit(EXIT_FAILURE); \
	} while(0)

int main(void)
{
	umask(0);//爲進程設置文件模式創建屏蔽字,設爲0表示不屏弊
	int fd;
	fd = open("test.txt", O_WRONLY | O_CREAT, 666);//666表示所有者,所屬組,其他用戶都可以讀寫
	if (fd == -1)
		ERR_EXIT("open error");

	printf("open succ\n");
	return 0;
}

           運行之後生成的文件:

      

三、read函數

函數名稱:read

函數原型:ssize_t read(int fd, void *buf, size_t count);                 

函數功能:從fd指向的文件的當前偏移量至多讀count個字節到buf中。成功返回寫入buf的字節數。出錯時則返回-1,

                    並設置errno。

返回值:   成功則返回文件描述符,否則返回 -1.(open返回的文件描述符一定是最小的未被使用的描述符。)

頭文件:   #include <unistd.h>

調用read後可能發生的情況:
調用返回一個等於count的值。結果和預期一致。
調用返回一個大於0小於count的值。一個信號打斷了讀取過程,或在讀入count個字節前已達到EOF。
調用返回0.這標誌着EOF。沒有可以讀的數據。
調用被阻塞,因爲沒有可以讀取的數據。這在非阻塞模式下不會發生。
調用返回-1,並且errno被設置爲EINTR。這表示在讀入字節之前收到了一個信號。可以重新進行調用。
調用返回-1,並且errno被設置爲EAGAIN。這表示讀取會因沒有可用的數據而阻塞,而讀請求應該在之後重開。這隻在非阻塞模式下發生。
調用返回-1,並且errno被設置不同於EINTR(系統調用被中斷)或EAGAIN(重試)的值。這表示某種更嚴重的錯誤。       
                      


四、write函數

函數名稱:write

函數原型:ssize_t write(int fd, const void *buf, size_t count);       

函數功能:函數向打開的設備或文件中寫數據.

返回值:   成功返回寫入的字節數,出錯返回-1並設置errno寫常規文件時,write的返回值通常等於請求寫的字節數

                   count,而向終端設備或網絡寫則不一定。

頭文件:   #include <unistd.h>

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

現在可以用open read write函數做一個小demo ,把一個文件的內容複製到另一個文件:

#include <stdio.h>  /*for fprintf*/
#include <unistd.h>  /*for read write*/
#include <sys/types.h>/*for open*/
#include <sys/stat.h>   /*for open*/
#include <fcntl.h>      /*for open*/
#include <stdlib.h>     /*for EXIT_FAILURE*/

#define ERR_EXIT(m) \
      do\
	  {\
	      perror(m);\
		  exit(EXIT_FAILURE);\
	  }while(0)

int main(int argc,char* argv[]){
 
   int infd;
   int outfd;
   if(argc!=3){
       fprintf(stderr,"Usage %s src dest\n",argv[0]);
       exit(EXIT_FAILURE);
   }
   infd = open(argv[1],O_RDONLY);
   if(infd==-1){
       ERR_EXIT("open src error");
   }
   if((outfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,644))==-1){
      ERR_EXIT("open dest error");
   }
   
   char buf[1024];
   int nread;
   int nwrite;
   while((nread=read(infd,buf,1024))>0){
      if((nwrite=write(outfd,buf,nread))==-1){
	      ERR_EXIT("write error");
	  }
   }
 
   close(infd);
   close(outfd);

   return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章