日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 文件系统编程之系统调用和标准I/O库

發布時間:2023/12/19 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 文件系统编程之系统调用和标准I/O库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系統調用

訪問設備驅動程序的底層函數主要有: open:打開文件或者設備。 read:從打開的文件或者設備里面讀取數據。 write:向文件或者設備寫數據。 close:關閉文件或者設備。 open系統調用: #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int open (const char *path, int flags); int open (const char *path, int flags, mode_t mode); path表示文件名,flags用來定義準備對打開的文件進行操作的動作。 如果open調用成功,則返回一個新的文件描述符(非負整型);如果失敗,就返回-1。close系統調用: #include <unistd.h> int close(int filedes); 成功返回0;出錯返回-1read系統調用: #include <unistd.h> ssize_t read(int filedes, const void *buf, size_t nbytes);< publishblog.blogchina.com http:> 將n個字節從文件描述符對應的文件讀出放入到buf中。成功則返回實際的讀取字節數。write系統調用: #include <unistd.h> ssize_t write(int filedes, const void *buf, size_t nbytes); 返回值是實際寫入的字節數(可能會小于nbytes);如果返回值是0,表示沒有寫入任何數據;如果返回值是-1,表示在write調用中出錯了。 將n個字節從buf中寫入到文件描述符對應的文件中。

常用標準I/O庫文件函數:fopen,fwrite,fread,fclose,fflush,fseek,fgets,getchar,fputs等系列的函數
他們與系統調用的一個主要的區別在于,這是帶緩沖的函數,操作的對象不是int型的文件描述符,而是fopen返回的FILE型的文件指針(*fp).對應的標準輸入,輸出,出錯為stdin,stdout,stderr文件指針。
我把這些函數的用法全都寫在這里:

#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <time.h>#define SIZE 1024// fopen int main0() {FILE* fp = fopen ("abc", "ab+");if (NULL == fp){perror ("fopen");return -1;}printf ("打開文件成功\n");return 0; }// fread int main1() {FILE* fp = fopen ("BTree.c", "ab+");if (NULL == fp){perror ("fopen");return -1;}char buf[SIZE] = {0};// feof 判斷是否讀到文件結尾,如果讀到文件結尾,它返回一個非0 的值int ret;while (ret = fread (buf, sizeof(char), SIZE-1, fp)){buf[ret*sizeof(char)] = '\0';printf ("%s\n", buf);}if (0 == ret && !feof(fp)){perror ("fread");return -1;}printf ("文件讀取結束\n");return 0; }// fwrite int main2() {FILE* fp = fopen ("1.ppt", "ab+");if (NULL == fp){perror ("fopen");return -1;}FILE* fp1 = fopen ("2.ppt", "ab+");if (NULL == fp1){perror ("fopen");return -1;}char buf[SIZE] = {0};// feof判斷是否讀到文件結尾,如果讀到文件結尾,它返回一個非0 的值int ret;while (ret = fread (buf, sizeof(char), SIZE, fp)){fwrite (buf, sizeof(char), ret, fp1);}if (0 == ret && !feof(fp)){perror ("fread");return -1;}printf ("文件讀取結束\n");fclose (fp);fclose (fp1);return 0; }// fgetc int main3() {FILE* fp = fopen ("1.ppt", "ab+");if (NULL == fp){perror ("fopen");return -1;}FILE* fp1 = fopen ("2.ppt", "ab+");if (NULL == fp1){perror ("fopen");return -1;}char buf[SIZE] = {0};// feof 判斷是否讀到文件結尾,如果讀到文件結尾,它返回一個非0 的值int ret;while(1){int c = fgetc (fp);if (EOF == c){break;}fputc (c, fp1);}fclose (fp);fclose (fp1);return 0; }// 數據獲取 /***************************************************************/ typedef struct student {int id;char name[20]; }STU;void write_data(STU* a, int len) {FILE* fp = fopen ("student", "ab+");if (NULL == fp){perror ("fopen");return;} // 要寫入個數fwrite (&len, sizeof(int), 1, fp);int i;for (i = 0; i < len; i++){// 寫入數據長度len = sizeof(a[i]); fwrite (&len, sizeof(int), 1, fp);// 寫入數據fwrite (&a[i], sizeof(STU), 1, fp);}fclose (fp); }// 讀取數據 void read_data() {FILE* fp = fopen ("student", "ab+");if (NULL == fp){perror ("fopen");return;}// 讀記錄的個數int count;fread (&count, sizeof(int), 1, fp);printf ("記錄個數是:%d\n", count);int i;STU tmp;for (i = 0; i < count; i++){int len;fread (&len, sizeof(int), 1, fp);// 讀取數據fread (&tmp, len, 1, fp);printf ("id = %d, name = %s\n", tmp.id, tmp.name);}fclose (fp); }int main4() {int i;STU a[20];for (i = 0; i < 20; i++){a[i].id = i; sprintf (a[i].name, "zhang%d", i);}int len = sizeof(a)/sizeof(a[0]); // 寫數據write_data(a, len);// 讀數據read_data();return 0; } /***************************************************************/// open int main5() {close(1);// 打開一個文件int fd = open ("test.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR | S_IXUSR);// int fd = open("test.txt", O_RDONLY);if (-1 == fd){printf ("打開文件失敗\n");perror ("open");printf ("%s\n", strerror(errno)); }printf ("fd = %d\n", fd);printf ("asdadsafsfkj\n", fd);printf ("asdadsafsfkj\n", fd);printf ("asdadsafsfkj\n", fd);printf ("asdadsafsfkj\n", fd);printf ("asdadsafsfkj\n", fd);printf ("asdadsafsfkj\n", fd);printf ("asdadsafsfkj\n", fd);// fflush(stdout);close(fd);return 0;}// read /***************************************************************/ int main6() {int fd = open ("BTree.c", O_RDONLY, 0777);if (-1 == fd){perror ("open");return -1;}// 緩沖區 char buf[SIZE] = {0};ssize_t ret = read (fd, buf, SIZE-1);if (-1 == ret){perror ("read");}// 返回值為0 代表讀到文件結尾if (0 == ret){printf ("文件讀取結束\n");}printf ("len = %d\n", strlen(buf));printf ("讀到%d字節:%s\n", ret, buf);return 0; }// 緩沖區覆蓋問題 int main7() {int fd = open ("BTree.c", O_RDONLY, 0777);if (-1 == fd){perror ("open");return -1;}char buf[SIZE] = {0};while(1){ssize_t ret = read (fd, buf, SIZE-1);if (-1 == ret){perror ("read");}// 返回值為0 代表讀到文件結尾if (0 == ret){printf ("文件讀取結束\n");break;}// printf ("len = %d\n", strlen(buf));// printf ("讀到%d 字節: %s\n", ret, buf);printf ("%s", buf);}return 0; }// 讀取數據之前清空緩沖區 int main8() {int fd = open ("BTree.c", O_RDONLY, 0777);if (-1 == fd){perror ("open");return -1;}char buf[SIZE] = {0};while(1){memset (buf, 0, SIZE); // 清空緩沖區ssize_t ret = read (fd, buf, SIZE-1);if (-1 == ret){perror ("read");}if (0 == ret){printf ("文件讀取結束\n");break;}printf ("%s", buf); }return 0; }// 每次讀完數據之后講下一個字節置為'\0'; int main9() {int fd = open ("BTree.c", O_RDONLY, 0777);if (-1 == fd){perror ("open");return -1;}char buf[SIZE] = {0};while(1){ssize_t ret = read (fd, buf, SIZE-1);if (-1 == ret){perror ("read");}if (0 == ret){printf ("文件讀取結束\n");break;}buf[ret] = '\0';printf ("%s", buf);}return 0; }// 讀一個完整的大數據 int main10() {int fd = open ("BTree.c", O_RDONLY, 0777);if (-1 == fd){perror ("open");return -1;}char buf[SIZE] = {0};char* p = buf;int count = SIZE - 1; // 每次要讀的數據個數ssize_t ret =0;while (ret = read (fd, p, count)){// 出錯if (-1 == ret){if (errno == EAGAIN || errno == EINTR){continue;}break;}printf ("sfjsfsjfs\n");// 讀完if (ret == count){break;}count -= ret; // 下一次要讀的數據p += ret;}printf ("len = %d\n", strlen(buf));// printf ("%s\n", buf);return 0; } /***************************************************************/// write int main11() {int fd = open ("abc", O_WRONLY|O_CREAT, 0777);if (-1 == fd){perror ("open");return -1;}char buf[SIZE] = {0};while(1){fgets (buf, SIZE, stdin);if (0 == strncmp ("end", buf, 3)){break;}ssize_t ret = write (fd, buf, strlen(buf));if (-1 == ret){perror ("write");}printf ("要寫的字節數:%d,實際寫的字節數:%d\n", SIZE, ret);}close(fd);return 0; }// 文件復制 int main12() {// 打開要讀的文件int fd1 = open ("1.ppt", O_RDONLY);if (-1 == fd1){perror ("open fd1");return -1;}int fd2 = open ("2.ppt", O_WRONLY|O_CREAT, 0777);if (-1 == fd2){perror ("open fd2");return -1;}int ret = 0;char buf[SIZE] = {0};while (ret = read (fd1, buf, SIZE)){if (-1 == ret){perror("read");break;}write (fd2, buf, ret);}printf ("文件復制完成\n");close (fd1);close (fd2);return 0; }// lseek int main13() {// 打開要讀的文件int fd = open ("abc2", O_RDWR|O_CREAT, 0777);if (-1 == fd){perror ("open fd1");return -1;}// 設置這個文件的偏移指針lseek (fd, 20, SEEK_SET);char* buf = "hello";write (fd, buf, strlen(buf));close (fd);return 0; }// 創建一個大文件 int main14() {// 打開要讀的文件int fd = open ("big", O_RDWR|O_CREAT, 0777);if (-1 == fd){perror ("open fd1");return -1;}// 設置這個文件的偏移指針到1G處lseek (fd, 1024*1024*1024, SEEK_SET);char* buf = "hello"; write (fd, "a", 1);close (fd);return 0; }// printf緩沖 int main15() {while(1){printf ("a");usleep (2000);}return 0; }// 文件偏移指針測試1 int main16() {// 打開要讀的文件int fd = open ("big", O_RDWR|O_CREAT, 0777);if (-1 == fd){perror("open fd1");return -1;}printf ("%d\n", fd);// 設置這個文件的偏移指針到1G處lseek (fd, 20, SEEK_SET);printf ("等待2些數據\n");getchar();char* buf = "hello";write (fd, "a", 1);getchar();close (fd);return 0; }// 文件偏移指針測試2 int main17() {// 打開要讀的文件int fd1 = open ("abc", O_RDWR|O_CREAT, 0777);if (-1 == fd1){perror ("open fd1");return -1;}printf ("abc fd = %d\n", fd1);int fd = open ("big", O_RDWR|O_CREAT, 0777);if (-1 == fd){perror ("open fd");return -1;}printf ("bif fd = %d\n", fd);// 設置這個文件的偏移指針到 1G處lseek (fd, 10, SEEK_SET);char *buf = "12345";write (fd, buf, strlen(buf));getchar();close (fd);return 0; }/***************************************************************/ // 隨機分組 // 函數功能:互換 void swap (int* a, int i, int j) {int tmp = a[i];a[i] = a[j];a[j] = tmp; } // 函數功能:打印 void printA (int* a, int len) {int i;for (i = 0; i < len; i++){if (0 == i % 4){printf ("\n");}printf ("%4d", a[len-i-1]);}putchar ('\n'); }int main18() {srand ((unsigned int)time(NULL));int a[40];int i;int len = 40;for (i = 0; i < 40; i++){a[i] = i;}for (i = len-1; i > 0; i--){int index = rand() % (i+1); // 獲取隨機數swap (a, index, i); // 將獲得的數和最后一個互換}printA (a, len);return 0; } /***************************************************************/

總結

以上是生活随笔為你收集整理的Linux 文件系统编程之系统调用和标准I/O库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。