3.1 Linux中的檔案IO (13、14節)
阿新 • • 發佈:2018-12-14
3.1.13.fcntl函式介紹
3.1.13.1、fcntl的原型和作用
(1)fcntl函式是一個多功能檔案管理的工具箱,接收2個引數+1個變參。第一個引數是fd表示要操作哪個檔案,第二個引數是cmd表示要進行哪個命令操作。變參是用來傳遞引數的,要配合cmd來使用。(2)cmd的樣子類似於F_XXX,不同的cmd具有不同的功能。學習時沒必要去把所有的cmd的含義都弄清楚(也記不住),只需要弄明白一個作為案例,搞清楚它怎麼看怎麼用就行了,其他的是類似的。其他的當我們在使用中碰到了一個fcntl的不認識的cmd時再去查man手冊即可。
3.1.13.2、fcntl的常用cmd
(1)F_DUPFD這個cmd的作用是複製檔案描述符(作用類似於dup和dup2),這個命令的功能是從可用的fd數字列表中找一個比arg大或者和arg一樣大的數字作為oldfd的一個複製的fd,和dup2有點像但是不同。dup2返回的就是我們指定的那個newfd否則就會出錯,但是F_DUPFD命令返回的是>=arg的最小的那一個數字。3.1.13.3、使用fcntl模擬dup2
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define FILENAME "1.txt" int main(void) { int fd1 = -1, fd2 = -1; fd1 = open(FILENAME, O_RDWR | O_CREAT | O_TRUNC, 0644); if (fd1 < 0) { perror("open"); return -1; } printf("fd1 = %d.\n", fd1); close(1); fd2 = fcntl(fd1, F_DUPFD, 0); printf("fd2 = %d.\n", fd2); while (1) { write(fd1, "aa", 2); sleep(1); write(fd2, "bb", 2); } close(fd1); return -1; }
3.1.14.標準IO庫介紹
3.1.14.1、標準IO和檔案IO有什麼區別
(1)看起來使用時都是函式,但是:標準IO是C庫函式,而檔案IO是linux系統的API(2)C語言庫函式是由API封裝而來的。庫函式內部也是通過呼叫API來完成操作的,但是庫函式因為多了一層封裝,所以比API要更加好用一些。
(3)庫函式比API還有一個優勢就是:API在不同的作業系統之間是不能通用的,但是C庫函式在不同作業系統中幾乎是一樣的。所以C庫函式具有可移植性而API不具有可移植性。
(4)效能上和易用性上看,C庫函式一般要好一些。譬如IO,檔案IO是不帶快取的,而標準IO是帶快取的,因此標準IO比檔案IO效能要更高。
3.1.14.2、常用標準IO函式介紹
(1)常見的標準IO庫函式有:fopen、fclose、fwrite、fread、ffulsh、fseek3.1.14.3、一個簡單的標準IO讀寫檔案例項
#include <stdio.h> // standard input output
#include <stdlib.h>
#include <string.h>
#define FILENAME "1.txt"
int main(void)
{
FILE *fp = NULL;
size_t len = -1;
//int array[10] = {1, 2, 3, 4, 5};
char buf[100] = {0};
fp = fopen(FILENAME, "r+");
if (NULL == fp)
{
perror("fopen");
exit(-1);
}
printf("fopen success. fp = %p.\n", fp);
// 在這裡去讀寫檔案
memset(buf, 0, sizeof(buf));
len = fread(buf, 1, 10, fp);
printf("len = %d.\n", len);
printf("buf is: [%s].\n", buf);
#if 0
fp = fopen(FILENAME, "w+");
if (NULL == fp)
{
perror("fopen");
exit(-1);
}
printf("fopen success. fp = %p.\n", fp);
// 在這裡去讀寫檔案
//len = fwrite("abcde", 1, 5, fp);
//len = fwrite(array, sizeof(int), sizeof(array)/sizeof(array[0]), fp);
len = fwrite(array, 4, 10, fp);
printf("len = %d.\n", len);
#endif
fclose(fp);
return 0;
}