Linux之操作文件的系統(tǒng)調(diào)用
需要引入的頭文件:
#inlcude<unistd.h>
1.打開文件
打開一個(gè)已存在的文件
int open(const char *pathname, int flags);
新建一個(gè)文件并創(chuàng)建權(quán)限
int open(const char *pathname, int flags, mode_t mode);
參數(shù)介紹
pathname:將要打開的文件路徑和名稱
flags:打開標(biāo)志
標(biāo)志介紹:
The argument flags must include one of the following access modes: O_RDONLY, O_WRONLY, or O_RDWR. These request opening the file read- only, write-only, or read/write, respectively.
O_RDONLY 只讀打開
O_RDWR 讀寫打開
O_CREAT 文件不存在則創(chuàng)建
O_APPEND 文件末尾追加
O_TRUNC 清空文件,重新寫入 mode
The following symbolic constants are provided for mode:
S_IRWXU 00700 user (file owner) has read, write, and execute permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write, and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write, and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
返回值:文件描述符
2. 讀文件
ssize_t read(int fd, void *buf, size_t count);
參數(shù)介紹
fd:對應(yīng)打開的文件描述符buf : 存放數(shù)據(jù)的空間count: 計(jì)劃一次從文件中讀多少字節(jié)數(shù)據(jù)返回值: 實(shí)際讀到的字節(jié)數(shù)
3. 寫文件
ssize_t write(int fd, const void *buf, size_t count);
參數(shù)介紹:
fd :對應(yīng)打開的文件描述符buf:存放待寫入的數(shù)據(jù)count:計(jì)劃一次向文件中寫入多少數(shù)據(jù)
4.關(guān)閉
int close(int fd);
fd :對應(yīng)的文件描述符
分析題
如果父進(jìn)程先打開一個(gè)文件,fork 后子進(jìn)程是否可以共享使用?
文件內(nèi)容

代碼
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
char buff[128] = {0};
int fd = open("myfile.txt", O_RDONLY);
pid_t pid = fork();
assert(pid != -1);
if (pid == 0)
{
read(fd, buff, 1);
printf("child buff = %s\n", buff);
sleep(1);
read(fd, buff, 1);
printf("child buff = %s\n", buff);
}
else
{
read(fd, buff, 1);
printf("parent buff = %s\n", buff);
sleep(1);
read(fd, buff, 1);
printf("parent buff = %s\n", buff);
}
close(fd);
exit(0);
}
運(yùn)行結(jié)果:

結(jié)論:
由于 fork 創(chuàng)建的子進(jìn)程的 PCB 是拷貝父進(jìn)程的,子進(jìn)程的 PCB 中的文件表指向打開文件的指針只是拷貝了父進(jìn)程 PCB 中的值,所以父子進(jìn)程共享父進(jìn)程 fork 之前打開的所有文件描述符。

練習(xí)題
完成對一個(gè)文件的復(fù)制(類似命令:cp)
原文件內(nèi)容為:

代碼:
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<assert.h>
int main(void)
{
char buff[128] = {0};
int fdr = open("myfile.txt", O_RDONLY);
assert(fdr != -1);
int fdw = open("newfile.txt", O_WRONLY | O_CREAT, 0600);
assert(fdw != -1);
int n = 0;
while (n = read(fdr, buff, 128) > 0)
{
write(fdw, buff, n);
}
close(fdr);
close(fdw);
exit(0);
}
運(yùn)行示例:
可以看到newfile.txt創(chuàng)建成功

系統(tǒng)調(diào)用和庫函數(shù)的區(qū)別
區(qū)別: 系統(tǒng)調(diào)用的實(shí)現(xiàn)在內(nèi)核中,屬于內(nèi)核空間,庫函數(shù)的實(shí)現(xiàn)在函數(shù)庫中,屬于用戶空間。
系統(tǒng)調(diào)用執(zhí)行過程:

到此這篇關(guān)于Linux之操作文件的系統(tǒng)調(diào)用的文章就介紹到這了,更多相關(guān)Linux文件系統(tǒng)調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
centos中NAT模式下靜態(tài)IP連接外網(wǎng)
這篇文章主要介紹了centos中NAT模式下靜態(tài)IP連接外網(wǎng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Linux中執(zhí)行定時(shí)任務(wù)的方法小結(jié)
有時(shí)候要在Linux系統(tǒng)上定時(shí)執(zhí)行腳本,Linux提供定時(shí)任務(wù)命令可以執(zhí)行,這篇文章小編就來和大家聊聊都有哪些方法可以實(shí)現(xiàn)定時(shí)任務(wù)吧2024-12-12
Linux統(tǒng)計(jì)一個(gè)文件中特定字符個(gè)數(shù)的方法
今天小編就為大家分享一篇關(guān)于Linux統(tǒng)計(jì)一個(gè)文件中特定字符個(gè)數(shù)的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
FOXHIS PMS前臺(tái)西軟服務(wù)器端和客戶端安裝教程
網(wǎng)上有很多關(guān)于西軟FOXHIS PMS的安裝教程,但大多沒有詳細(xì)描述并且內(nèi)容非常膚淺粗燥,本特意把自己的安裝過程寫成文檔并記下,后面的數(shù)據(jù)庫操作沒有提供圖片,但是我相信絕對能夠看得懂2017-01-01
讓Apache支持shtml實(shí)現(xiàn)include文件解析的配置方法
Apache支持include文件解析shtml首先要應(yīng)該修改Apache配置文件httpd.conf2011-03-03

