《UNIX環境高級編程》(第三版第一章)

1.
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow

2.
//當文件是一個符號鏈接時,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節點編號。

5.
#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()

13.
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。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章