在沒有IDE的時候,記住一些常用的庫函數的函數名、參數、基本用法及注意事項是很有必要的。
參照Linux_C_HS.chm的目錄,我大致將常用的函數分為一下幾類:
這次主要總結的是上面黑色部分,關於文件操作的函數。
* * 函數名 用法 備注 * *1. int open(const char *pathname, int flags); open and possibly create a file or device flags 必須包含O_RDONLY, O_WRONLY, or O_RDWR中的任何一個 * *2. int open(const char *pathname, int flags, mode_t mode); UP mode只是在flags中包含O_CREAT時才有效 * *3. int fsync(int fd); synchronize a file's in-core state with storage device 寫完數據close前必須先同步,以防意外 * *4. off_t lseek(int fd, off_t offset, int whence); 定位文件位置 第三個參數可以為SEEK_SET SEEK_CUR SEEK_END * *5. ssize_t read(int fildes, void *buf, size_t nbyte); UP 文件位置會隨讀取的字節數移動 * *6. ssize_t write(int fildes, const void *buf, size_t nbyte); UP UP * *7. int close(int fd); UP UP * *8. void *mmap(void *addr, size_t length, int prot, int flags, 內存映射 先用fstat得到文件大小,然後使用該函數將文件內容映射到內存中,然後就可以 int fd, off_t offset); 直接調用字符串函數操作。 * *9. int munmap(void *addr, size_t length); 釋放內存 UP * *10. int ftruncate(int fd, off_t length); truncate a file to a specified length 在新建文件時,如果用到內存映射,那麼就需要先調用該函數給文件預置一個大小,否則會出錯 * *11. int fstat(int fd, struct stat *buf); 獲得文件的基本信息 具體參數見man,可以查到文件的大小、修改日期等 *
/*標准C函數 * 函數名 用法 備注 * *1. FILE *fopen(const char *path, const char *mode); NT mode可以為r,r+,w,w+,a,a+,rw等 * *2. int fseek(FILE *stream, long offset, int whence); NT 定位文件位置 * *3. long ftell(FILE *stream); 當前文件位置 NT * *4. void rewind(FILE *stream); 移動文件位置到文件頭 NT * *5. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); NT NT * *6. size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); NT NT * *7. int feof(FILE *stream); 判斷文件是否已經讀完 NT * *8. int fscanf(FILE *stream, const char *format, ...); 按格式讀取文件流 還有scanf家族的其他函數,比如sscanf可以讀取字節流 * *9. int fprintf(FILE *stream, const char *format, ...); 按格式將內容寫入到文件中 還有sprintf,vprintf等等 * *10. int vfprintf(FILE *stream, const char *format, va_list ap); 直接將不定參數寫入到文件 相對應的還有讀取函 * *11. int fflush(FILE *stream); NT NT * *12. char *fgets(char *s, int size, FILE *stream); NT 讀到換行符或EOF時停止 * *13. int fileno(FILE *stream); 返回整型文件描述符 這是和GLIBC相通的地方 * *14. int fputs(const char *s, FILE *stream); NT 不寫入結束符\0 * */
* 函數名 用法 備注 * *1. int remove(const char *pathname); NT 刪除指定路徑的文件 * *2. int rename(const char *old, const char *new); NT 重命名 * *3. int utime(const char *path, const struct utimbuf *times); NT 修改文件的存取時間 * *4. int stat(const char *restrict path, struct stat *restrict buf); NT 可以進一步獲得文件的詳細信息 * *5. int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result); NT 讀取文件夾內容 * *6. DIR *opendir(const char *name); NT 打開文件夾,這是第一步 * *7. char *getcwd(char *buf, size_t size); NT 獲得當前的絕對路徑 * *8. int chmod(const char *path, mode_t mode); NT 改變文件權限 * *9. int closedir(DIR *dirp); NT 打開文件夾後必須要關閉 * *10. int chdir(const char *path); NT 改變當前的工作目錄 *
* *1. void va_start(va_list ap, last); 必須首先被調用 * *2. type va_arg(va_list ap, type); 緊接著,根據%s %d %c得到實際的值 * *3. void va_end(va_list ap); 得到需要的值後,就調用end。 * *
如上,只是對常用的函數進行簡單的總結,一些不常用的,比如鏈接之類的,就沒有進行歸類。
這些函數,至少要知道有這些功能,而不需要自己再去實現,具體參數不清楚的,知道函數名後,在Linux下,用man fun就可以有更具體的闡述。
這個不知道有沒有,可以使用system函數執行shell命令復制
如:system("cp /home/file1 /root/file2");
另外樓上們說的fread、fwrite等函數都可能因為文件太大無法在內存展開而失敗。
樓上已經講的很好了, 我再給你普及一下。
內核的memset函數是內核自己用的。 你在用戶層面是看不見這個memset的。
內核所有的函數都是自己內部實現的, 沒有使用別的庫。
你寫應用程序的時候用的memset一般是由glibc提供的,
最起碼弄清楚一點, 內核不使用其他的C庫, 完全自給自足。 你平時用的C庫函數在內核是找不到的
樓上已經講的很好了, 我在給你普及一下。
內核的memset函數是內核自己用的。 你在用戶層面是看不見這個memset的。
內核所有的函數都是自己內部實現的, 沒有使用別的庫。
你寫應用程序的時候用的memset一般是由glibc提供的,
最起碼弄清楚一點, 內核不使用其他的C庫, 完全自給自足。 你平時用的C庫函數在內核是找不到的
還有內核源碼不光是PC上用的, 其他架構的源碼也提供, arch 文件夾下面就是與架構相關的代碼
PC一般是x86