【摘要】 介紹Linux下目錄編程、標準文件編程、Linux系統文件接口編程、GDB調試等知識點。
任務1:目錄操作
學習系統編程: 主要學習系統函數的調用。
#include /* int argc :表示傳入的參數數量 char **argv:存放傳入的參數數據,本身是一個二維數組。 argv[0] 表示第一個參數 argv[1] 表示第二個參數 */ int main(int argc,char **argv) { int i; for(i=0;i;i++)<> { printf("argv[%d]=%s\n",i,argv[i]); } return 0; } |
文件操作函數: fopen、fclose、fread、fwrite…………
目錄操作函數:
#include #include DIR *opendir(const char *name); //打開目錄 struct dirent *readdir(DIR *dirp); //讀取目錄信息 int closedir(DIR *dirp); //關閉目錄 |
struct dirent { ino_t d_ino; /* inode number */ off_t d_off; /* offset to the next dirent */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; /* type of file; not supported by all file system types */ char d_name[256]; /* filename 文件名稱 */ }; |
?? (練習目錄操作)
1.?實現ls *.c 類似的功能。 產品: 視頻播放器、音樂播放器
2.?強化第一題。ls *.c
(1)?拼接路徑: /mnt/hgfs/linux-share-dir/test/test.c (通過命令行傳入路徑)
示例:./a.out ./work/test .c
結果: ./work/test/123.c ./work/test/456.c
(2)?獲取絕對路徑: /mnt/hgfs/linux-share-dir/test/test.c
示例:./a.out ./work/test .c
結果: /user/work/test/123.c /user/work/test/456.c
3.?實現目錄的拷貝。 類似cp命令
int mkdir(const char *pathname, mode_t mode); |
(1)?實現一層目錄的拷貝。
(2)?實現所有目錄的拷貝。(擴展)
char *strstr(const char *haystack, const char *needle); const char *haystack:在哪里查找 const char *needle:查找的數據 返回值: 返回查找到的數據的首地址 |
4.?實現cat命令效果
(1)?示例: cat 123.c
(2)?示例: cat 123.c -n (擴展作業)
5.?實現du命令的功能。
(1)?示例: du 123.c 顯示出文件的大小
(2)?示例: du 123.c -h 使用合理的單位顯示出文件的大小(擴展作業)
1.1 獲取當前目錄絕對地址相關函數
#include char *getcwd(char *buf, size_t size); char *getwd(char *buf); char *get_current_dir_name(void); //獲取絕對路徑 int chdir(const char *path); //修改當前目錄,即切換目錄,相當于 cd 命令 |
1.2 mkdir函數創建目錄
#include #include int mkdir(const char *pathname, mode_t mode); // 777 #include #include mode_t umask(mode_t mask); //設置創建目錄或者文件的默認權限 一般在調用mkdir時,需要先調用umask(0); mode_t mode參數的填寫說明: S_IRWXU 00700 user (file owner) has read, write and exe-cute permission S_IRUSR 00400 user has read permission S_IWUSR 00200 user has write permission S_IXUSR 00100 user has execute permission S_IRWXG 00070 group has read, write and execute permis-sion S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IXGRP 00010 group has execute permission S_IRWXO 00007 others have read, write and execute per-mission S_IROTH 00004 others have read permission S_IWOTH 00002 others have write permission S_IXOTH 00001 others have execute permission |
1.3 獲取目錄和文件的狀態信息
#include #include #include int stat(const char *path, struct stat *buf); //直接獲取源文件的狀態() int fstat(int fd, struct stat *buf); //獲取已經打開成功的文件狀態 int lstat(const char *path, struct stat *buf); //不區分鏈接文件 //存放文件的狀態信息 struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID (if special file) */ off_t st_size; /* 保存文件的大小*/ blksize_t st_blksize; /* blocksize for file system I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last modification */ time_t st_ctime; /* time of last status change */ }; m的參數:-->st_mode S_ISREG(m) 判斷是否是普通文件 S_ISDIR(m) directory? 目錄 S_ISCHR(m) character device? S_ISBLK(m) block device? S_ISFIFO(m) FIFO (named pipe)? S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.) S_ISSOCK(m) socket? (Not in POSIX.1-1996.) |
任務2:帶緩沖區的文件IO操作
文件中的3個標準指針:
stderr Standard error output stream. 存放標準錯誤信息的文件 stdin Standard input stream. 存放標準輸入信息的文件 stdout Standard output stream. 存放標準輸出信息的文件 |
??示例:
#include int main() { char buff[10]; while(1) { if(fread(buff,1,10,stdin)>0) { printf("讀出的數據=%s\n",buff); } } return 0; } |
帶緩沖區:這一系列函數適合操作普通文件。
size_t fread(void *restrict, size_t, size_t, FILE *restrict); int fseek(FILE *, long, int); size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict); int fclose(FILE *); |
任務3:非緩沖區的文件IO操作
open()
#include #include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); //在創建文件的時候才調用。 ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd); |
??作業
1.?練習read、write讀寫函數。
2.?將cat命令編寫使用open一系列函數實現。
3.?將stat文件狀態的時間轉為標準時間打印出來。
st_atime=1516528093 st_mtime=1516586761 st_ctime=1516586761 以上3個值是秒單位的時間。 是從1970年1月1日0時0分0秒開始計算。 |
格式: xxxx年xx月xx日 xx時:xx分:xx秒 星期x
轉換時間:(寫出一個類似于時鐘的程序,可以加一個鬧鐘,判斷時間是否到達)
(1)?編寫一個函數實現秒單位的時間轉為標準時間
(2)?編寫一個函數實現將標準時間轉為秒單位
#include int main(int argc,char**argv) { while(1) { long cnt=time(NULL); //獲取當前系統時間 sleep(1); //睡眠一秒鐘 printf("cnt=%d\n",cnt); } return 0; } |
4.?擴展作業:重寫一個scanf與printf函數。
int printf(const char *format, ...); int scanf(const char *format, ...); |
…可變形參
任務4:安裝編輯器
??壓縮與打包名稱
.1.1 解壓命令的使用格式: tar -xvf <壓縮文件的名稱>
1.1.?想要指定解壓之后文件存放的位置: tar -xvf <壓縮文件的名稱> -C <指定的目錄>
1.2 打包指定文件夾或者文件: tar -cvf <新文件的名稱> <要打包的目錄>
示例: [root@wbyq test]# tar cvf SublimeText2.tar SublimeText2
注意:壓縮包不能直接在共享目錄下解壓。
??運行軟件:
(1)?# ./sublime_text
(2)?# ./sublime_text & (后臺運行程序)
??切換中文輸入法:Ctrl+空格
??linux操作系統保存可執行文件的環境變量: PATH
(1)?打印環境變量的值:echo $PATH
(2)修改環境變量:# vim /etc/profile (系統開機的時候自動執行)
(3) source命令立即生效環境變量。(只是針對當前的終端)
示例:# source /etc/profile
任務5: GDB調試器
使用GDB調試工具: gdb <可執行文件的名稱>
示例: gdb a.out
要支持調試程序,需要在gcc編譯的時候加上-g選項參數。
示例:gcc -g 123.c
??常用的命令:
breakpoints -- 設置程序的斷點(簡寫b)。 語法: b <行號>或者 b <函數名稱> running -- 開始運行程序(簡寫run) list -- 打印出當前的代碼 next -- 單步調試 quit -- 退出調試界面 |
-
Linux
+關注
關注
87文章
11304瀏覽量
209521 -
編程
+關注
關注
88文章
3616瀏覽量
93738 -
GDB調試
+關注
關注
0文章
24瀏覽量
1447
發布評論請先 登錄
相關推薦
評論