//當文件是一個符號鏈接時,stat返回的是該符號鏈接引用的文件的信息,而lstat返回的是該符號鏈接的有關信息。
int stat(const char *restrict pathname,struct stat *restrict buf);
int lstat(const char *restrict pathname,struct stat *restrict buf);
int fstat(int fd,struct stat *buf);
3.
$touch f1
$ln f1 f2 硬鏈接,相同inode。
$ln -s f1 f3 軟連接,不同inode。
4.
在最高層次的根目錄中,..(父目錄)和.(當前目錄)相同。
$ls -ldi /. /..
-l 以長格式的形式查看當前目錄下所有可見文件的詳細信息。
-d 僅打印目錄信息,而不是打印目錄中所有文件的信息。
-i 打印文件或目錄的i節點編號。
#include <dirent.h> //directory entries(entry)目錄項。
DIR *opendir(const char *pathname); //一定要是目錄。
struct dirent *readdir(DIR *dp);
int closedir(DIR *dp);
6.
$rmdir 目錄 目錄非空刪不了。
$rm -rf 目錄
-r 向下遞歸,不管有多少級目錄,一併刪除。
-f 直接強行刪除,不做任何提示。
7.
int printf(const char *format,...);
int fprintf(FILE *stream,const char *format,...);
int sprintf(char *str,const char *format,...);
int snprintf(char *str,size_t size,const char *format,...);
int vprintf(const char *format,va_list ap);
int vfprintf(FILE *stream,const char *format,va_list ap);
int vsprintf(char *str,const char *format,va_list ap);
int vsnprintf(char *str,size_t size,const char *format,va_list ap); //v可變,n大小。
8.
__attribute__((noreturn)) //若你需要用一個沒有返回值的函數A提前終止一個有返回值的函數B。這樣可以避免警告:提示B沒有返回值。
$cat test1.c
extern void exitnow();
int foo(int n)
{
if(n>0)
{
exitnow();
/* control never reaches this point */
}
else
return 0;
}
$gcc -c -Wall test1.c
test1.c: In function `foo':
test1.c:8: warning: this function may return with or without a value
$cat test2.c
extern void exitnow() __attribute__((noreturn));
int foo(int n)
{
if(n>0)
exitnow();
else
return 0;
}
$gcc -c -Wall test2.c
no warnings!
9.
int chdir(const char *path); //改變工作目錄。
10.
重定向 > <
11.
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
12.
pid_t getpid(); //標準保證它能保存在一個長整型中。(long)getpid()
pid_t fork(void); //調用一次,返回兩次
pid_t waitpid(pid_t pid,int *statloc,int options);
int execlp(const char *filename,const char *arg0,.../*(char *)0*/); //若出錯,返回-1;若成功,不返回。
14.
thread線程:一個進程內的所有進程共享同一地址空間、文件描述符、棧以及與進程相關的屬性。因爲它們能訪問同一存儲區,所以各線程在訪問共享數據時需要採取同步措施以避免不一致性(信號量)。
15.
/*errno可以是一個包含出錯編號的整數,也可以是一個返回出錯編號指針的函數。在支持多線程的環境中,多個線程共享進程地址空間,每個線程都有屬於它自己的局部errno以避免一個線程干擾另一個線程。*/
extern int errno;
extern int *__errno_location(void);
#define errno (*__errno_location())
/*解釋:errno實際上並不是我們通常認爲的是個整型數值,而是通過整型指針來獲取的。這個整型就是線程安全的。另外,宏之所以這樣實現,是因爲標準庫規定了必須能夠通過&errno方式取得保存錯誤代碼的變量的地址,因此__errno_location()函數的返回值是指針,並把宏定義爲解引用函數返回的地址*__errno_location()。如果__errno_location直接返回int類型,此時就無法取得保存錯誤代碼的變量的地址。*/
//對於errno應當注意兩條規則:
//a.如果沒有出錯,其值不會被例程清除。因此,僅當函數的返回值指明出錯時,才檢驗其值。
//b.任何函數都不會將errno值設置爲0,而且在<errno.h>中定義的所有常量都不爲0。
16.
char *strerror(int errnum);
void perror(const char *msg);
17.
uid_t getuid(void);
gid_t getgid(void);
18.
中斷鍵:Delete鍵或Ctrl+C(SIGINT信號)
退出鍵:Ctrl+\(SIGQUIT信號)
19.
void (*signal(int signo,void (*func)(int)))(int); //r若成功,返回以前的信號處理配置;若出錯,返回SIG_ERR。
#define SIG_ERR (void (*)()) -1
#define SIG_DFL (void (*)()) 0 //default
#define SIG_IGN (void (*)()) 1 //忽略信號
20.
日曆時間:自1970年1月1日00:00:00以來所經過的秒數累計值(time_t)。
進程時間:以時鐘的滴答計算(clock_t)。每秒時鐘滴答數:sysconf(_SC_CLK_TCK);
時鐘時間
用戶CPU時間
系統CPU時間
21.
/dev/null,或稱空設備,是一個特殊的設備文件,它丟棄一切寫入其中的數據(但報告寫入操作成功),讀取它則會立即得到一個EOF。