一、文件描述符
函數名稱: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_IWUSR或S_IWRITE,00200 權限,代表該文件所有者具有可寫入的權限。
S_IXUSR或S_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;
}