#include #include #include #include #include #include #define size 1024
/*open()
#include #include #include int open(const char *pathname, int flags, mode_tmode);
pathname:要開啟或要建立的檔名稱
flags:標誌位,指定開啟檔案的操作方式
mode:指定新檔案的訪問許可權(僅當建立新檔案時才用)
返回值:若成功返回fp(檔案描述符),否則返回-1
*/int main1()
printf("fd = %d\n",fd);
//close(fd);
return 0;}/*
read()
#include ssize_t read(int fd, void *buf, size_t count);
fd:要讀取的檔案的描述符。
buf:讀取到的資料要放入的緩衝區。
count:要讀取的位元組數。
返回值:若成功返回讀到的位元組數,若已到檔案結尾則返回0,若出錯則返回-1並設定變數errno的值。
注意:1. 這裡的size_t是無符號整型,ssize_t是有符號整型。
2. buf指向的記憶體空間必須事先分配好。
*/int main2();
int fd = open("sqstack.c",o_rdwr ,077);
if(fd == -1)
ssize_t ret = read(fd,buf,size-1);
if(ret == -1)//出錯則返回-1
if(ret == 0)//若已到檔案結尾則返回0,成功返回讀到的位元組數,
printf("buf len = %d\n",strlen(buf));//檔案位元組數
printf("讀到第%d個位元組: %s \n",ret,buf);
return 0;
}//緩衝區問題
/*read每次讀的資料是呼叫者要求的大小,
比如呼叫要求讀取10個位元組資料,read就會讀10個位元組數
據到陣列中,而fread不一樣,為了加快讀的速度,
fread每次都會讀比要求更多的資料,然後放到緩衝區中,
這樣下次再讀資料只需要到緩衝區中去取就可以了。
*/int main3()
char buf[size] = ;
while(1)
if(ret == 0)//若已到檔案結尾則返回0,成功返回讀到的位元組數,
//2 buf[ret] = '\0';//每次讀完之後將末尾位元組置為'\0'
printf("%s\n",buf);
} #endif
//讀取乙個完整的資料
int fd = open("sqstack.c",o_rdonly ,0777);
if(fd == -1)
char buf[size] = ;
char *p = buf;
int count = size - 1;//每次要讀的資料個數
ssize_t ret = 0;
while(ret = read (fd, p, count))
break;
} if(ret == 0)//讀完資料
count -= ret;//下一次要都的資料
p += ret; }
printf("len = %d\n",strlen(buf));
printf("%s\n",buf);
return 0;
}
linux系統呼叫之檔案系統操作
access 確定檔案的可訪問性 chdir 改變當前工作目錄 fchdir 參見chdir chmod 改變檔案方式 fchmod 參見chmod chown 改變檔案的屬主或使用者組 fchown 參見chown lchown 參見chown chroot 改變根目錄 stat 取檔案狀態資訊 ...
系統呼叫之檔案訪問
1 write 系統呼叫 系統呼叫write 的作用是,把緩衝區 buf的前 nbytes 位元組寫入到與檔案描述符 fildes 關聯的檔案中,同時它會返回實際寫入的位元組數。如果返回 0,就表示為寫出任何資料 如果是 1,就表示在 write 系統呼叫中出現了錯誤,對應的錯誤碼儲存在全域性變數 ...
系統呼叫之lseek
注意 這個指標是和檔案描述符相掛鉤的,並不與這個檔案掛鉤,所以可以有多個程序來對這個檔案進行操作,不會影響各自。當從檔案讀取資料時,核心從指標指向的位置開始,讀取指定的位元組數,然後移動指標,指向下乙個未被讀取過的位元組,寫檔案的過程也是類似。off t oldpos lseek int fd,of...