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調用成功,則返回一個新的文件描述符(非負整型);如果失敗,就返回-1close系統調用:
#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;
}
/***************************************************************/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448486.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql 索引:類型 、創建

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一個簡單的對比測試 以我去年測試的數據作為一個簡單示例&#xff0c;20多條數據源隨機生成200萬條數據&#xff0c;平均每條數據源都重…

水調歌頭·中秋

轉載于:https://www.cnblogs.com/divineka/archive/2004/09/04/39560.html

代碼面試最常用的10大算法

摘要&#xff1a;面試也是一門學問&#xff0c;在面試之前做好充分的準備則是成功的必須條件&#xff0c;而程序員在代碼面試時&#xff0c;常會遇到編寫算法的相關問題&#xff0c;比如排序、二叉樹遍歷等等。 在程序員的職業生涯中&#xff0c;算法亦算是一門基礎課程&#…

fork與vfork的區別

fork與vfork的區別 1.vfork保證子進程先運行&#xff0c;在它調用exec或exit之后父進程才可能被調度運行。如果在調用這兩個函數之前子進程依賴于父進程的進一步動作&#xff0c;則會導致死鎖。 2.fork要拷貝父進程的進程環境&#xff1b;而vfork則不需要完全拷貝父進程的進程…

IDEA 2018 集成 MyBatis Generator 插件 詳解、代碼生成

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、修改maven的pom文件 只需要將如下依賴添加到pom.xml文件中即可。&#xff08;注意此處是以plugin的方式&#xff0c;放在<plugins…

MongoDB監控及報警

轉載請注明出處&#xff1a;https://www.cnblogs.com/shining5/p/11142357.html MongoDB監控及報警 Prometheus是由SoundCloud開發的開源監控報警系統和時序列數據庫&#xff0c;其使用go語言開發。基本原理是通過HTTP協議周期性抓取被監控組件的狀態&#xff0c;任意組件只要提…

umask命令:設置文件的默認權限掩碼

今天接觸到了掩碼&#xff0c;從博客上總結了一些關于掩碼解釋比較全面的分析&#xff0c;和大家分享下。 文件權限是linux系統中的一種安全機制&#xff0c;通過設置不同的權限&#xff0c;可以達到限制用戶操作的目的&#xff0c;有效地保證了文件的完整性。 默認的情況下&…

如何學習開源項目及Ceph的淺析

摘要&#xff1a;開源技術的學習和采用確實存在著一定門檻&#xff0c;然而學習各種開源項目已經成為許多開發者不可回避的工作內容。那么&#xff0c;對于類似OpenStack的大型開源項目&#xff0c;開發者該如何著手&#xff0c;這里我們看章宇的分享。 【編者按】在 上一屆O…

Mybatis 中更新方法: updateByPrimaryKeySelective() 和 updateByPrimaryKey() 的區別

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 int updateByPrimaryKeySelective(TbItem record); int updateByPrimaryKey(TbItem record); 上面的是逆轉工程生成的Mapper接口 對應…

SHT知識庫操作要點

1.保存文檔庫模板&#xff1a; 知識庫---設置---文檔庫設置---權限管理---將文檔另存為模板2.設置版本號&#xff1a;知識庫---設置---文檔庫設置---常規設置---版本控制設置3.設置文檔庫權限&#xff1a;列表---設置---文檔庫設置---此文檔庫的權限&#xff08;用戶組讀取列表…

淺談三種特殊進程:孤兒進程,僵尸進程和守護進程

昨天學了進程控制&#xff0c;就這三種特殊的進程研究了一下&#xff0c;其中也借鑒了一些前人總計的經驗。 1、孤兒進程 如果父進程先退出,子進程還沒退出那么子進程將被 托孤給init進程,這里子進程的父進程就是init進程(1號進程).其實還是很好理解的。 // 父進程先子進程退…

設計師為什么要學編程,開發者為什么要學設計?

摘要&#xff1a;設計師和開發者目前正處于互聯網的兩端&#xff0c;看著彼此做不同的工作。如果他們能互相學習對方的技術&#xff0c;那么會協作得更好。 很多開發者認為&#xff0c;設計師應該學會如何編寫代碼&#xff0c;這一點是真的&#xff1a;通過學習&#xff0c;設計…

git 查看遠程倉庫地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 就一個命令&#xff1a; git remote -v 如下&#xff1a;

tensorflow之tf.train.exponential_decay()指數衰減法

exponential_decay(learning_rate, global_steps, decay_steps, decay_rate, staircaseFalse, nameNone) 使用方式&#xff1a; tf.tf.train.exponential_decay() 例子&#xff1a; tf.train.exponential_decay(self.config.e_lr, self.e_global_steps&#xff0c;self.config…

wait( )和 waitpid( )

進程一旦調用了wait&#xff0c;就立即阻塞自己&#xff0c;由wait自動分析是否當前進程的某個子進程已經退出&#xff0c;如果讓它找到了這樣一個已經變成僵尸的子進程&#xff0c;wait就會收集這個子進程的信息&#xff0c;并把它徹底銷毀后返回&#xff1b;如果沒有找到這樣…

享受閱讀的十二個好習慣

嚴謹的國際閱讀率比較研究顯示&#xff0c;當下韓國國民人均閱讀量約為每年11本&#xff0c;法國約為8.4本&#xff0c;日本在8.4—8.5本之間。全世界每年閱讀書籍數量排名第一的是猶太人&#xff0c;平均每人一年讀書64本。而中國13億人口&#xff0c;扣除教科書&#xff0c;平…

在 vscode 中使用 Git :拉取、提交、克隆

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 PS&#xff1a;轉載此文后&#xff0c;網友在評論中提到還有其它方法&#xff0c;不過目前個人尚在研究中&#xff0c;有興趣的朋友們也可…

偶也要去上海Tech一把了

公司組織的&#xff0c;后天去&#xff0c;呵呵&#xff1a;&#xff09;希望能多認識一點博客園的兄弟姐妹轉載于:https://www.cnblogs.com/martinxj/archive/2004/09/14/42930.html

進程控制常用的一些操作

1、獲取進程的id int main0() {printf ("當前進程 ID %d\n", getpid());printf ("當前父進程&#xff1a;%d\n", getppid());printf ("當前用戶&#xff1a; %d\n", getuid());while (1);return 0; }2、fork 和 vfork之前的博客里有&#xf…

vscode 配置 git (配置、暫存、推送、拉取、免密)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 vscode 中對 git 進行了集成&#xff0c;很多操作只需點擊就能操作&#xff0c;無需寫一些 git 指令。 不過這就需要你對 vscode 進行配…