頭文件包含路徑?
?
linux 操作系統分為兩大空間:用戶空間和內核空間
這樣劃分,是為了保護內核的核心組件,不被輕易訪問和修改
????????
????????系統調用:安全的訪問內核空間
其核心是:函數API(API:用戶編程接口)
所謂系統調用是指操作系統提供給用戶的組“特殊”接口,用戶程序可以通過這組“特殊”接口來獲得操作系統內核提供的的服務
?學習linux應用編程,就是學習使用API【API需要閱讀手冊——參考man手冊、linux c手冊】
硬件中斷
2.
文件編程
文件IO:一切皆為文件(內核中虛擬文件系統(VFS));用文件系統來管理
文件IO:
?文件分為四大類:-普通文件、d目錄文件、l鏈接文件和c/b設備文件(三小類:p管道文件、s套接字和f堆棧文件)
都可以用C庫函數和API來調用
把一切抽象成文件,用統一的方式管理設備和文件,節省開發資源;用過文件來操作硬件
文件描述符:
?知道一個文件的id(文件指針),操作該id就是操作該文件;
3.初級IO(creat及異常處理)
creat函數
1.宏定義? :
2.數字【0:八進制;3位8進制來表示文件的權限,r用4標識,w用2標識,x用1標識】
已經創建的文件,不能通過再creat來修改權限;
如何獲取錯誤信息?
方法一:
errno:系統全局變量(所有應用都可以訪問),用來保存錯誤編號(整數)
使用該變量時,要有<errno.h>這個頭文件
?方法二:perror --------------------常用-----------------------
?方法三:
open函數
O_WRONLY:寫? ? ? ? O_RDONLY:讀? ? ? O_RWRD:可讀可寫
O_CREAT:不存在就創建;【O_EXCEL: O_CREAT存在時,打開已有的文件就報錯】
O_APPEND:文件讀寫位置移到末尾;? ? O_TRUNC:文件長度為零(清空)
O_NONBLOCK:非阻塞的方式打開;
close函數
假設有兩個file descript指向同一個文件,可以close(fd1/fd2)都可以,也可以各close一次
read
write
lseek
lseek的返回值是,lseek操作后,文件讀寫位置距離文件首的距離(字節數),以此可以測量文件大小:
lseek(fd3, 0, SEEK_END); // 返回值是文件大小(字節數)
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>int main(int argc, char **argv)
{// int fd1;// fd1 = creat(argv[1], S_IRWXU | S_IRWXG | S_IRWXO);
#if 0// 第一種方法if (errno == EISDIR){printf("is a directory\n");}// 第二種方法:perror("error is:");// 第三種方法:printf("%s\n", strerror(errno));#endif// printf("%d\n",fd1);// int fd2=open(argv[1],O_RDWR);// printf("%d\n",fd2);// printf("%d\n",close(fd1));// printf("%d\n",close(fd2));int fd3 = open(argv[1], O_RDWR | O_CREAT, S_IRWXG | S_IRWXO | S_IRWXU);char buffer[1024];gets(buffer);int w_num;printf("%d\n", w_num = write(fd3, buffer, strlen(buffer)));if (w_num == -1){printf("write error\n");exit(-1);}//lseek(fd3, 0, SEEK_SET);//lseek(fd3, 0, SEEK_END); // 返回值是文件大小(字節數)lseek(fd3, -w_num, SEEK_CUR);//將文件讀寫位置移到開頭int r_num;r_num = read(fd3, buffer, strlen(buffer));buffer[r_num] = '\0';printf("read num:%d; read content:%s\n", r_num, buffer);return 0;
}
獲取文件屬性:
?
struct stat file_a1;//1.stat("a.txt",&file_a1);printf("stat.size=%ld\n",file_a1.st_size);//輸出a.txt的大小;//2.struct stat file_a2;fstat(fd3,&file_a2);printf("fstat.size=%ld\n",file_a2.st_size);//輸出a.txt的大小;//3.struct stat file_a3;lstat("a.txt",&file_a3);printf("lstat.size=%ld\n",file_a3.st_size);//輸出a.txt的大小;