1. 程式人生 > >3.1 Linux中的檔案IO (13、14節)

3.1 Linux中的檔案IO (13、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、fseek

3.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;
}