學習系統呼叫介面
文章目錄
- 學習系統呼叫介面
- 一、學習系統呼叫介面
- 1.open
- 2.write
- 3.read
- 4.lseek
- 5.close
- 二、代碼實作
- 1.代開檔案
- 2.寫入資料
- 3.讀取資料
- 4.代碼實作
一、學習系統呼叫介面
?1.open

pathname:檔案路徑名; ? ? ? ? ? ? flags:標志位;
必選其一:O_RDONLY, O_WRONLY,O_RDWR

可選項:O_CREAT:如果檔案不存在則創建;
? ? ? O_EXCL:跟O_CREAT一起使用,如果檔案已經存在則報錯回傳;
? ? ? O_TRUNC:打開檔案時截斷檔案長度為0–清空內容;
? ? ? O_APPEND:將寫入設定為追加寫;
w+:O_RDWR | O_CREAT | O_TRUNC; a+:O_RDWR | O_APPEND | O_CREAT
mode:檔案的權限設定,0777–如果使用了O_CREAT就一定要指定mode;
回傳值:成功回傳非負整數–操作句柄-檔案描述符; 失敗回傳-1;
2.write

fd:open回傳的操作句柄,用于明確操作的是哪個檔案;
buf:要寫入檔案的資料; ? count:要寫入檔案的資料長度;
回傳值:成功回傳實際寫入檔案的資料長度;失敗回傳-1;
3.read

fd:open回傳的操作句柄,用于明確操作的是哪個檔案;
buf:存放讀取到的資料的緩沖區;
count:要讀取的資料長度;
回傳值:成功回傳實際讀取到的資料長度;失敗回傳-1;
4.lseek

fd:open回傳的操作句柄;? ? ? offset:偏移量;
whence:相對起始偏移位置-SEEK_SET/SEEK_CUR/SEEK_END
回傳值:跳轉后的位置相對于檔案起始位置的偏移量;失敗回傳-1;
5.close

二、代碼實作
1.代開檔案
代碼如下(示例):
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
int main()
{
//int open(檔案名,選項標志,權限)
int fd = open("test.txt", O_RDWR|O_CREAT, 0777);
if(fd < 0){
perror("open error");
return -1;
}
close (fd);
return 0;
}

此時修改權限有兩種方法:
1.修改權限掩碼,但是此時并不建議直接修改權限掩碼,因為修改之后是會一直生效的是對整個系統產生效果的,
2.通過系統呼叫函式來修改權限


2.寫入資料
代碼如下(示例):
char *ptr = "昏昏欲睡\n";
//write(句柄,資料,長度)
int ret = write(fd, ptr, strlen(ptr));
if(ret < 0){
perror("write error");
return -1;
}
資料寫入成功

追加寫


3.讀取資料
char buf[1024] = {0};
ret = read(fd, buf, 1023);
if(ret < 0){
perror("read error");
return -1;
}
printf("%d----%s\n", ret, buf);

4.代碼實作
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
int main()
{
umask(0);//將當前行程的檔案權限掩碼設定為0
//int open(檔案名,選項標志,權限)
int fd = open("test.txt", O_RDWR|O_CREAT|O_APPEND, 0777);
if(fd < 0){
perror("open error");
return -1;
}
char *ptr = "昏昏欲睡\n";
//write(句柄,資料,長度)
int ret = write(fd, ptr, strlen(ptr));
if(ret < 0){
perror("write error");
return -1;
}
//lseek(句柄,偏移量,相對位置)
lseek(fd, 0, SEEK_SET);
char buf[1024] = {0};
ret = read(fd, buf, 1023);
if(ret < 0){
perror("read error");
return -1;
}
printf("%d----%s\n", ret, buf);
close (fd);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/283161.html
標籤:AI
上一篇:有關C語言記憶體管理的一些總結
