1. linux信號量
信號量是包含一個非負整數型的變數,並且帶有兩個原子操作wait和signal。Wait還可以被稱為down、P或lock,signal還可以被稱為up、V、unlock或post。在UNIX的API中(POSIX標准)用的是wait和post。
對於wait操作,如果信號量的非負整形變數S大於0,wait就將其減1,如果S等於0,wait就將調用線程阻塞;對於post操作,如果有線程在信號量上阻塞(此時S等於0),post就會解除對某個等待線程的阻塞,使其從wait中返回,如果沒有線程阻塞在信號量上,post就將S加1.
由此可見,S可以被理解為一種資源的數量,信號量即是通過控制這種資源的分配來實現互斥和同步的。如果把S設為1,那麼信號量即可使多線程並發運行。另外,信號量不僅允許使用者申請和釋放資源,而且還允許使用者創造資源,這就賦予了信號量實現同步的功能。可見信號量的功能要比互斥量豐富許多。
POSIX信號量是一個sem_t類型的變數,但POSIX有兩種信號量的實現機制: 無名信號量 和 命名信號量 。無名信號量只可以在共享內存的情況下,比如實現進程中各個線程之間的互斥和同步,因此無名信號量也被稱作基於內存的信號量;命名信號量通常用於不共享內存的情況下,比如進程間通信。
同時,在創建信號量時,根據信號量取值的不同,POSIX信號量還可以分為:
下面是POSIX信號量函數介面:
信號量的函數都以sem_開頭,線程中使用的基本信號函數有4個,他們都聲明在頭文件semaphore.h中,該頭文件定義了用於信號量操作的sem_t類型:
【sem_init函數】:
該函數用於創建信號量,原型如下:
該函數初始化由sem指向的信號對象,設置它的共享選項,並給它一個初始的整數值。pshared控制信號量的類型,如果其值為0,就表示信號量是當前進程的局部信號量,否則信號量就可以在多個進程間共享,value為sem的初始值。
該函數調用成功返回0,失敗返回-1。
【sem_destroy函數】:
該函數用於對用完的信號量進行清理,其原型如下:
成功返回0,失敗返回-1。
【sem_wait函數】:
該函數用於以原子操作的方式將信號量的值減1。原子操作就是,如果兩個線程企圖同時給一個信號量加1或減1,它們之間不會互相干擾。其原型如下:
sem指向的對象是sem_init調用初始化的信號量。調用成功返回0,失敗返回-1。
sem_trywait()則是sem_wait()的非阻塞版本,當條件不滿足時(信號量為0時),該函數直接返回EAGAIN錯誤而不會阻塞等待。
sem_timedwait()功能與sem_wait()類似,只是在指定的abs_timeout時間內等待,超過時間則直接返回ETIMEDOUT錯誤。
【sem_post函數】:
該函數用於以原子操作的方式將信號量的值加1,其原型如下:
與sem_wait一樣,sem指向的對象是由sem_init調用初始化的信號量。調用成功時返回0,失敗返回-1。
【sem_getvalue函數】:
該函數返回當前信號量的值,通過restrict輸出參數返回。如果當前信號量已經上鎖(即同步對象不可用),那麼返回值為0,或為負數,其絕對值就是等待該信號量解鎖的線程數。
【實例1】:
【實例2】:
之所以稱為命名信號量,是因為它有一個名字、一個用戶ID、一個組ID和許可權。這些是提供給不共享內存的那些進程使用命名信號量的介面。命名信號量的名字是一個遵守路徑名構造規則的字元串。
【sem_open函數】:
該函數用於創建或打開一個命名信號量,其原型如下:
參數name是一個標識信號量的字元串。參數oflag用來確定是創建信號量還是連接已有的信號量。
oflag的參數可以為0,O_CREAT或O_EXCL:如果為0,表示打開一個已存在的信號量;如果為O_CREAT,表示如果信號量不存在就創建一個信號量,如果存在則打開被返回,此時mode和value都需要指定;如果為O_CREAT|O_EXCL,表示如果信號量存在則返回錯誤。
mode參數用於創建信號量時指定信號量的許可權位,和open函數一樣,包括:S_IRUSR、S_IWUSR、S_IRGRP、S_IWGRP、S_IROTH、S_IWOTH。
value表示創建信號量時,信號量的初始值。
【sem_close函數】:
該函數用於關閉命名信號量:
單個程序可以用sem_close函數關閉命名信號量,但是這樣做並不能將信號量從系統中刪除,因為命名信號量在單個程序執行之外是具有持久性的。當進程調用_exit、exit、exec或從main返回時,進程打開的命名信號量同樣會被關閉。
【sem_unlink函數】:
sem_unlink函數用於在所有進程關閉了命名信號量之後,將信號量從系統中刪除:
【信號量操作函數】:
與無名信號量一樣,操作信號量的函數如下:
命名信號量是隨內核持續的。當命名信號量創建後,即使當前沒有進程打開某個信號量,它的值依然保持,直到內核重新自舉或調用sem_unlink()刪除該信號量。
無名信號量的持續性要根據信號量在內存中的位置確定:
很多時候信號量、互斥量和條件變數都可以在某種應用中使用,那這三者的差異有哪些呢?下面列出了這三者之間的差異:
2. Linux C函數實例速查手冊的目錄
第1章 初級I/O函數
1.1 close函數:關閉已經打開的文件
1.2 creat函數:創建一個文件
1.3 p函數:復制文件描述符
1.4 p2函數:復制文件描述符到指定的位置
1.5 fcntl函數:改變文件的狀態
1.6 fsync函數:將緩沖區數據回寫到磁碟文件
1.7 Lseek函數:移動文件的讀寫位置
1.8 open函數:打開一個文件
1.9 read函數:讀取文件的數據
1.10 sync函數:將所有打開的文件寫回磁碟
1.11 write函數:輸出內容到文件
第2章 文件管理操作函數
2.1 access函數:判斷進程是否具有訪問文件的許可權
2.2 alphasort函數:按照字母順序排序目錄結構
2.3 chdir函數:改變當前的工作目錄
2.4 chmod函數:改變文件的許可權
2.5 chown函數:改變文件的所有者
2.6 chroot函數:改變進程的根目錄
2.7 closedir函數:關閉目錄文件
2.8 fchdir函數:使用文件描述符改變當前的工作目錄
2.9 fchmod函數:改變一個已經打開的文件的許可權
2.10 fstat函數:得到一個打開文件的狀態
2.11 truncate函數:改變一個打開文件的大小
2.12 ftw函數:遍歷目錄樹
2.13 get_current_dir_name函數:取得當前的工作目錄
2.14 getcwd函數:取得進程的當前工作目錄
2.15 lchown函數:改變符號鏈接文件的擁有者
2.16 link函數:建立一個硬鏈接
2.17 lstat函數:得到符號鏈接的文件狀態
2.18 nftw函數:遍歷目錄樹
2.19 opendir函數:打開目錄文件
2.20 readdir函數:讀取目錄文件的內容
2.21 readlink函數:讀取符號鏈接文件本身的內容
2.22 realpath函數:將相對目錄路徑轉換成絕對路徑
2.23 remove函數:刪除文件或者目錄
2.24 rename函數:更改文件的名稱或位置
2.25 rewinddir函數:回卷目錄文件
2.26 seekdir函數:文件定位函數
2.27 stat函數:取得文件狀態
2.28 symlink函數:創建一個符號鏈接
2.29 telldir函數:取得目錄文件的讀取位置
2.30 truncate函數:改變文件大小
2.31 umask:設置創建文件時使用的許可權掩碼
2.32 unlink函數:刪除文件的一個硬鏈接
第3章 標准I/O函數
3.1 clearerr函數:清除錯誤標志
3.2 fclose函數:關閉流文件描述符
3.3 fdopen函數:轉換文件描述符到文件指針
3.4 feof函數:文件結束判斷函數
3.5 fflush函數:刷新流文件讀寫緩存
3.6 fgetc函數:從流文件中讀取一個字元
3.7 fgetpos函數:返迴流文件當前讀寫位置
3.8 fgets函數:從流文件中讀出一行數據
3.9 fileno函數:獲得流文件的文件描述符
3.10 fopen函數:打開文件
3.11 fputc函數:將字元寫入流文件
3.12 fputs函數:將字元串寫入流文件
3.13 fread函數:從流文件中讀出數據
3.14 freopen函數:打開文件
3.15 fseek函數:移動流文件的讀寫位置
3.16 fsetpos函數:設置流文件當前讀寫位置
3.17 ftell函數:得到流文件的讀取位置
3.18 fwrite函數:向流文件中寫入數據
3.19 getc函數:從文件中讀出一個字元
3.20 getchar函數:從標准輸入中讀入一個字元
3.21 gets函數:從標准輸入中讀入一行數據
3.22 mktemp函數:產生臨時文件的文件名
3.23 putc函數:將字元寫入文件
3.24 putchar函數:將字元輸出到標准輸出中
3.25 puts函數:將字元串輸出在標准輸出中
3.26 rewind函數:將流文件的讀寫位置移動到文件的起始位置
3.27 setbuf函數:設置文件緩沖區
3.28 setbuffer函數:設置文件緩沖區
3.29 setlinebuf函數:設置行緩沖模式
3.30 setvbuf函數:設置自定義文件緩沖區
3.31 tmpfile函數:建立臨時的二進制文件
3.32 ungetc函數:將字元寫迴文件
第4章 格式化輸入輸出函數
4.1 fprintf函數:格式化輸出到文件
4.2 fscanf函數:格式化從文件中讀出數據
4.3 printf函數:格式化輸出
4.4 scanf函數:格式化輸入
4.5 snprintf函數:格式化字元輸入
4.6 sprintf函數:格式化字元串列印
4.7 sscanf函數:格式化字元串取值
4.8 vfprintf函數:可變參數輸出函數
4.9 vfscanf函數:格式化輸入
4.10 vprintf函數:格式化輸出函數
4.11 vscanf函數:格式化輸入函數
4.12 vsnprintf函數:格式化字元串復制
4.13 vsprintf函數:格式化字元串復制
4.14 vsscanf函數:格式化字元輸入
第5章 進程式控制制
5.1 abort函數:進程異常終止函數
5.2 atexit函數:進程終止處理函數
5.3 execl函數:執行文件函數
5.4 execle函數:執行文件的函數
5.5 execlp函數:從PATH環境變數中查找文件並執行
5.6 execv函數:執行文件
5.7 execve函數:執行文件
5.8 execvp函數:執行文件
5.9 exit函數:結束進程運行的函數
5.10 _exit函數:結束進程運行的函數
5.11 fork函數:建立一個新的進程
5.12 getgid函數:取得實際進程組ID
5.13 getegid函數:取得有效進程組ID
5.14 getpid函數:取得有效組ID
5.15 getppid函數:取得父進程的進程識別碼
5.16 getpriority函數:取得進程執行優先順序
5.17 longjmp函數:跳到原先setjmp存儲的堆棧環境
5.18 on_exit函數:設置程序正常結束前調用的函數
5.19 setjmp函數:存儲當前堆棧環境
5.20 setgid函數:設置進程的進程組ID
5.21 setuid函數:設置進程組ID
5.22 setpriority函數:設置程序進程優先順序
5.23 siglongjmp函數:跳到原先sigset jmp存儲的堆棧環境
5.24 sigsetjmp函數:存儲當前堆棧環境和屏蔽的信號集
5.25 system函數:執行Shell命令
5.26 vfork函數:建立一個新的進程
5.27 wait函數:等待子進程中斷或結束
5.28 waitpid函數:等待子進程中斷或結束
5.29 wait3函數:等待進程結束並且輸出子進程統計信息
第6章 進程間通信函數
6.1 ftok函數:獲得項目相關的IPC鍵值
6.2 msgctl函數:消息隊列操作函數
6.3 msgget函數:創建或打開消息隊列
6.4 msgrcv函數:讀取消息隊列
6.5 msgsnd函數:向消息隊列中寫入消息
6.6 semctl函數:信號量操作函數
6.7 semget函數:創建或打開信號量
6.8 semop函數:釋放或獲取信號量
6.9 shmat函數:導入共享內存
6.10 shmctl函數:共享內存操作函數
6.11 shmdt函數:將共享內存從程序中脫離
6.12 shmget函數:創建共享內存
6.13 mkfifo函數:創建fifo管道函數
6.14 pclose函數:關閉管道文件
6.15 pipe函數:創建匿名管道
6.16 popen函數:創建管道文件
第7章 信號函數
7.1 alarm函數:內核定時器函數
7.2 kill函數:信號發送函數
7.3 pause函數:進程暫停執行函數
7.4 raise函數:向進程自身發送信號函數
7.5 sigaction函數:高級信號處理方式設置函數
7.6 sigaddset函數:添加信號到信號集函數
7.7 sigdelset函數:刪除信號集中對應信號函數
7.8 sigemptyset函數:清空信號集函數
7.9 sigfillset函數:填充信號集函數
7.10 sigismember函數:測試某個信號是否在信號集中
7.11 signal函數:信號處理方式設置函數
7.12 sigpause函數:暫停進程直到信號到來
7.13 sigpending函數:查詢未決信號
7.14 sigprocmask函數:信號屏蔽函數
7.15 sigsuspend函數:暫停直到信號到來
7.16 sleep函數:讓進程休眠一段時間
第8章 用戶、組函數及環境變數函數
8.1 clearenv函數:刪除所有環境變數的值
8.2 cuserid函數:獲得用戶名函數
8.3 endgrent函數:關閉系統組文件函數
8.4 endpwent函數:關閉系統口令函數
8.5 entent函數:關閉utmp文件
8.6 fgetgrent函數:從文件中讀取組數據
8.7 fgetpwent函數:從文件中讀取密碼格式數據
8.8 getegid函數:獲得有效(effective gid)組識別符
8.9 getenv函數:取得環境變數的值
8.10 geteuid函數:獲得有效(effective uid)用戶識別符
8.11 getgid函數:獲得組識別符
8.12 getgrent函數:從文件/etc/group中讀取組信息
8.13 getgrgid函數:從文件/etc/group中查找組信息
8.14 getgrnam函數:從文件/etc/group中查找組信息
8.15 getgroups函數:返回當前用戶所屬的組列表
8.16 getlogin函數:獲取當前用戶的賬號名稱
8.17 getpw函數:獲取指定uid的用戶信息
8.18 getpwent函數:讀取/etc/passwd文件中的數據
8.19 getpwnam函數:以用戶名獲取用戶信息
8.20 getpwuid函數:以用戶ID獲取用戶信息
8.21 getuid函數:獲取當前進程所屬的用戶ID
8.22 getutent函數:獲取登錄信息
8.23 getutid函數:獲取指定用戶ID的登錄信息
8.24 getutline函數:查找指定的登錄信息
8.25 initgroups函數:初始化組信息
8.26 logwtmp函數:添加登錄記錄信息
8.27 putenv函數:改變環境變數的值
8.28 pututline函數:添加登錄信息
8.29 setegid函數:設置有效組ID
8.30 setenv函數:改變環境變數的值
8.31 seteuid函數:設置有效用戶ID
8.32 setfsgid函數:設置進程的文件系統的組ID
8.33 setfsuid函數:設置進程的文件系統的用戶ID
8.34 setgid函數:設置進程的組ID
8.35 setgrent函數:將文件etc/group的讀寫位置移動到起始位置
8.36 setgroups函數:設置當前進程的組識別符
8.37 setpwent函數:將文件etc/passwd的讀寫位置移動到起始位置
8.38 setregid函數:設置當前進程的真實以及有效組ID
8.39 setreuid函數:設置當前進程的真實以及有效用戶ID
8.40 setuid函數:設置進程的用戶ID
8.41 setutent函數:將文件utmp的讀寫位置移動到起始位置
8.42 unsetenv函數:清除環境變數的值
8.43 updwtmp函數:將登錄數據記錄寫入utmp文件
8.44 utmpname函數:設置文件utmp的絕對位置
第9章 錯誤處理與內存分配函數
9.1 brk函數:改變數據段大小
9.2 calloc函數:內存分配函數
9.3 ferror函數:文件錯誤判斷
9.4 free函數:釋放動態分配內存函數
9.5 getpagesize函數:獲得操作系統內存頁大小函數
9.6 malloc函數:動態內存分配函數
9.7 mmap函數:文件映射函數
9.8 munmap函數:釋放映射的內存地址
9.9 perror函數:錯誤原因輸出函數
9.10 realloc函數:內存截取函數
9.11 sbrk函數:增加數據空間
9.12 strerror函數:錯誤代碼查詢
第10章 日誌函數、動態函數與正則表達式函數
10.1 closelog函數:關閉信息記錄
10.2 dlclose函數:關閉動態庫文件
10.3 dlerror函數:動態函數出錯處理
10.4 dlopen函數:打開動態庫文件
10.5 dlsym函數:在動態庫文件中查找函數
10.6 openlog函數:打開記錄信息
10.7 regcomp函數:編譯正則表達式
10.8 regerror函數:編譯錯誤判斷函數
10.9 regexec函數:執行正則匹配
10.10 regfree函數:釋放正則模式串資源
10.11 syslog函數:輸出記錄信息
第11章 時間函數
11.1 asctime函數:字元串時間操作函數
11.2 clock函數:計算運行時間函數
11.3 ctime函數:字元串時間函數
11.4 difftime函數:計算時間差函數
11.5 ftime函數:取得系統時間
11.6 gettimeofday函數:取得系統當前時間
11.7 gmtime函數:日歷時間格式函數
11.8 localtime函數:獲得當前系統時間
11.9 mktime函數:系統時間轉換函數
11.10 settimeofday函數:系統時間設置函數
11.11 strftime函數:時間格式化輸出函數
11.12 time函數:獲得系統當前時間
11.13 tzset函數:設置系統時區變數tzname
第12章 socket相關函數
12.1 accept函數:處理socket請求函數
12.2 bind函數:將socket描述符與一個套介面綁定
12.3 connect函數:與遠程主機連接
12.4 endprotoent函數:結束網路協議的讀取函數
12.5 endservent函數:關閉文件/etc/services
12.6 gethostbyaddr函數:由IP獲得主機信息
12.7 gethostbyname函數:由主機名獲得主機信息
12.8 getprotobyname函數:由協議名獲取協議數據
12.9 getprotobynumber函數:由協議編號獲取協議數據
12.10 getprotoent函數:讀取文件/etc/rotoent中的網路協議數據
12.11 getservbyname函數:獲得網路服務協議數據
12.12 getservbyport函數:獲得網路服務協議數據
12.13 getservent函數:讀取主機網路服務數據
12.14 getsockopt函數:獲得指定socket描述符的狀態
12.15 herror函數:錯誤原因輸出函數
12.16 hstrerror函數:錯誤代碼查詢
12.17 htonl函數:地址位元組順序轉換
12.18 htons函數:地址位元組順序轉換
12.19 inet_addr函數:網路地址類型轉換
12.20 inet_aton函數:網路地址類型轉換
12.21 inet_ntoa函數:網路地址類型轉換
12.22 listen函數:網路socket監聽
12.23 ntohl函數:地址位元組順序轉換
12.24 ntohs函數:地址位元組順序轉換
12.25 recv函數:接收消息
12.26 recvfrom函數:接收消息
12.27 recvmsg函數:多緩沖讀取數據
12.28 send函數:向遠程主機發送數據
12.29 sendto函數:發送數據到遠程主機
12.30 setprotoent函數:打開網路協議文件
12.31 setservent函數:打開網路服務文件
12.32 setsockopt函數:設置socket描述符的狀態
12.33 shutdown函數:結束socket套接字
12.34 socket函數:創建網路套接字
第13章 字元測試函數
13.1 isalnum函數:判斷字元是否為英文字母或數字
13.2 isalpha函數:判斷字元是否為英文字母
13.3 isascii函數:判斷字元是否為ASCII字元
13.4 isblank函數:判斷字元是否為空白字元
13.5 iscntrl函數:判斷字元是否為ASCII的控制字元
13.6 isdigit函數:判斷字元是否為阿拉伯數字
13.7 isgraph函數:判斷字元是否為可列印字元
13.8 islower函數:判斷字元是否為小寫英文字母
13.9 isprint函數:判斷字元是否為可列印字元
13.10 isspace函數:判斷字元是否為空格字元
13.11 ispunct函數:判斷字元是否為標點符號
13.12 isupper函數:判斷字元是否為大寫英文字母
13.13 isxdigit函數:判斷字元是否為十六進制數字
第14章 數據轉換函數
14.1 atof函數:將字元串轉換成浮點數
14.2 atoi函數:將字元串轉換成整數
14.3 atol函數:將字元串轉換成長整數
14.4 ecvt函數:將浮點數轉換成字元串
14.5 fcvt函數:將浮點數轉換成字元串
14.6 gcvt函數:將浮點數轉換成字元串
14.7 strtod函數:將字元串轉換成浮點數
14.8 strtol函數:將字元串轉換成長整數
14.9 strtoul函數:將字元串轉換成無符號長整數
14.10 toascii函數:將整數轉換成合法的ASCII字元
14.11 tolower函數:將大寫字母轉換成小寫字母
14.12 toupper函數:將小寫字母轉換成大寫字母
第15章 字元串處理函數
15.1 bcmp函數:比較兩塊內存中的內容
15.2 b函數:復制內存中的內容
15.3 bzero函數:將一塊內存內容全清零
15.4 ffs函數:在一個整數中查找第一個值為真的位
15.5 index函數:查找字元串中第一個出現的指定字元
15.6 memccpy函數:復制內存中的內容
15.7 memchr函數:在一塊內存指定范圍查找一個指定字元
15.8 memcmp函數:比較內存中存放的內容
15.9 memcpy函數:復制一塊內存內容到另一塊中
15.10 memfrob函數:對某個內存區重新編碼
15.11 memmove函數:復制內存內容
15.12 memset函數:將某值填入到一塊內存區域
15.13 rindex函數:查找字元串中最後一個出現的指定字元
15.14 strcasecmp函數:忽略大小寫比較字元串
15.15 strcat函數:將一個字元串連接另一字元串的尾部
15.16 strchr函數:查找字元串中指定字元
15.17 strcmp函數:比較兩個字元串
15.18 strcoll的函數:根據當前環境信息來比較字元串
15.19 strcpy函數:復制一個字元串的內容到另一個字元串中
15.20 strcspn函數:計算字元串中由非指定字元集字元組成的子字元串的長度
15.21 strp函數:復制字元串內容
15.22 strfry函數:隨機重組一個字元串
15.23 strlen函數:返回字元串長度
15.24 strncasecmp函數:忽略大小寫比較兩個字元串
15.25 strncat函數:將一個字元串的前n個字元連接到另一字元串的尾部
15.26 strncmp函數:比較兩個字元串
15.27 strncpy函數:復制字元串
15.28 strpbrk函數:查找字元串中第一個出現的指定字元
15.29 strrchr函數:查找字元串中最後一個出現的指定字元
15.30 strspn函數:計算字元串中由指定字元集字元組成的子字元串的長度
第16章 數學計算函數
16.1 abs函數:計算整數的絕對值
16.2 acos函數:計算反餘弦的值
16.3 asin函數:計算反正弦的值
16.4 atan函數:計算反正切的值
16.5 atan2函數:計算反正切的值
16.6 ceil函數:計算大於或等於給定參數的最小整數
16.7 cos函數:計算餘弦的值
16.8 cosh函數:計算雙曲線的餘弦值
16.9 div函數:計算兩整數相除後的商和余數
16.10 exp函數:計算浮點數的指數
16.11 fabs函數:計算浮點數的絕對值
16.12 frexp函數:計算浮點數的尾數和指數
16.13 hypot函數:計算直角三角形斜邊長度
16.14 labs函數:計算長整數的絕對值
16.15 ldexp函數:計算浮點數與2的exp次方的積
16.16 ldiv函數:計算兩長整數相除後的商和余數
16.17 log函數:計算以e為底的對數值
16.18 log10函數:計算以10為底的對數值
16.19 modf函數:將浮點數分解為小數和整數兩部分
16.20 pow函數:計算次方值
16.21 sin函數:取正弦的值
16.22 sinh函數:計算雙曲線的正弦值
16.23 sqrt函數:計算浮點數的平方根
16.24 tan函數:計算角度的正切值
16.25 tanh函數:計算雙曲線的正切函數值
第17章 隨機數及數據加密函數
17.1 crypt函數:對字元串使用DES演算法編碼
17.2 drand48函數:產生一個正的隨機浮點數
17.3 erand48函數:產生一個正的隨機浮點數
17.4 initstate:建立隨機數狀態數組
17.5 jrand48函數:產生一個長整型的隨機數
17.6 lcong48函數:設置48位運算的隨機數種子
17.7 lrand48函數:產生一個正的長整型隨機數
17.8 mrand48函數:產生一個長整型隨機數
17.9 nrand48函數:產生一個正的長整數隨機數
17.10 rand函數:產生偽隨機數
17.11 random函數:產生隨機數
17.12 seed48函數:設置48位運算的隨機數種子
17.13 setstate函數:建立隨機數狀態數組
17.14 srand函數:設置隨機數種子
17.15 srand48函數:設置48位運算的隨機數種子
17.16 srandom函數:設置隨機數種子
17.17 getpass函數:取得用戶輸入密碼字元串
第18章 數據結構函數
18.1 bsearch函數:在有序數組中二分查找數據
18.2 hcreate函數:建立哈希表
18.3 hdestroy函數:刪除哈希表
18.4 hsearch函數:在哈希表中查找關鍵數據
18.5 lfind函數:線性搜索
18.6 lsearch函數:線性搜索
18.7 qsort函數:使用快速排序法排列數組
18.8 tdelete函數:從二叉樹中刪除數據
18.9 tfind函數:搜索二叉樹
18.10 tsearch函數:搜索二叉樹
18.11 twalk函數:遍歷二叉樹
第19章 其他函數
19.1 getopt函數:分析命令參數
19.2 isatty函數:判斷文件描述符是否為終端
19.3 pselect函數:多路轉接I/O
19.4 select函數:多路I/O轉接
19.5 ttyname函數:返回終端機的名稱
附錄A Linux函數的首字母索引
附錄B Linux指令的首字母索引
3. linux open函數創建文件的默認許可權問題
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main() {
int fd = -1;
fd = open("_561804018.dat", O_CREAT | O_TRUNC | O_RDWR, 0666);
if (fd < 0) {
perror("open");
return -1;
}
char buff[64];
strcpy(buff, "Hello!I am writing to this file!");
int count = strlen(buff);
if (write(fd, buff, count) < 0) {
perror("write");
return -1;
}
if (lseek(fd, 0, SEEK_SET) < 0) {
perror("lseek");
return -1;
}
if (read(fd, buff, 10) < 0) {
perror("read");
return -1;
}
buff[10] = 0x00;
printf("%s\n", buff);
if (fd > 0) {
close(fd);
fd = -1;
}
return 0;
}
4. linux c 的 open(文件路徑,O_WRONLY | O_CREAT) 裡面的與運算為什麼可以實現打不開就創建
open 函數可以打開或創建一個文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的文件描述符,出錯返回-1並設置errno
在Man Page中open 函數有兩種形式,一種帶兩個參數,一種帶三個參數,其實在C代碼
中open 函數是這樣聲明的:
int open(const char *pathname, int flags, ...);
最後的可變參數可以是0個或1個,由flags 參數中的標志位決定,見下面的詳細說明。
pathname 參數是要打開或創建的文件名,和fopen 一樣,pathname 既可以是相對路徑也可以是絕
對路徑。flags 參數有一系列常數值可供選擇,可以同時選擇多個常數用按位或運算符連接起
來,所以這些常數的宏定義都以O_開頭,表示or。
必選項:以下三個常數中必須指定一個,且僅允許指定一個。
O_RDONLY 只讀打開
O_WRONLY 只寫打開
O_RDWR 可讀可寫打開
以下可選項可以同時指定0個或多個,和必選項按位或起來作為flags 參數。可選項有很多,這
里只介紹一部分,其它選項可參考open(2)的Man Page:
O_APPEND 表示追加。如果文件已有內容,這次打開文件所寫的數據附加到文件的末尾而不
覆蓋原來的內容。
O_CREAT 若此文件不存在則創建它。使用此選項時需要提供第三個參數mode ,表示該文件
的訪問許可權。
O_EXCL 如果同時指定了O_CREAT,並且文件已存在,則出錯返回。
O_TRUNC 如果文件已存在,並且以只寫或可讀可寫方式打開,則將其長度截斷
(Truncate)為0位元組。
O_NONBLOCK 對於設備文件,以O_NONBLOCK 方式打開可以做非阻塞I/O(Nonblock I/O).
5. linux闃誨炰笌闈為樆濉瀕inux闃誨為潪闃誨
鍦ㄩ潪闃誨炴ā寮忎笂鎬庝箞鐭ラ亾recv鎺ユ敹鏁版嵁瀹屾垚錛
浠linux涓媡cpsocket緙栫▼涓轟緥錛氶樆濉炲氨鏄痳ecv/read鐨勬椂鍊檚ocket鎺ユ敹緙撳啿鍖鴻佹槸鏈夋暟鎹灝辮伙紝娌℃暟鎹鎴戝氨涓鐩寸潯瑙夎禆鐫涓嶈蛋錛岀洿鍒版湁鏁版嵁鏉ヤ簡璇誨畬鎴戞墠璧般
send/write鐨勬椂鍊欙紝瑕佹槸鍙戦佺紦鍐插尯婊′簡錛屾病鏈夌┖闂寸戶緇鍙戦佷簡鎴戜篃涓鐩寸潯瑙夎禆鐫涓嶈蛋錛岀洿鍒板彂閫佺紦鍐插尯鑵懼嚭瓚沖熺殑絀洪棿璁╂垜鎶婃暟鎹鍏ㄩ儴濉炲埌鍙戦佺紦鍐插尯閲屾垜鎵嶈蛋銆
錛堝綋鐒跺傛灉浣犻氳繃setsockopt璁劇疆浜嗚誨啓瓚呮椂錛岃秴鏃舵椂闂村埌浜嗚繕鏄浼氳繑鍥-1鍜孍AGAIN錛屼笉鍐嶇潯瑙夌瓑寰咃級
闈為樆濉炲氨鏄痳ecv/read鐨勬椂鍊欙紝瑕佹槸鎺ユ敹緙撳啿鍖烘湁鏁版嵁鎴戝氨璇誨畬錛屾病鏈夋暟鎹鎴戠洿鎺ュ甫鐫榪斿洖鐨-1鍜孍GAIN璧頒漢錛岀粷涓嶇潯瑙夌瓑寰呰借鏃墮棿銆
write/send鐨勬椂鍊欙紝瑕佹槸鍙戦佺紦鍐插尯鏈夎凍澶熺殑絀洪棿錛屽氨絝嬪埢鎶婃暟鎹濉炲埌鍙戦佺紦鍐插尯鍘伙紝鐒跺悗璧頒漢錛屽傛灉鍙戦佺紦瀛樺尯婊′簡錛岀┖闂翠笉瓚籌紝閭g洿鎺ュ甫鐫榪斿洖鐨-1鍜孍AGAIN璧頒漢銆傝嚦浜嶪O澶氳礬澶嶇敤錛岄栧厛瑕佺悊瑙g殑鏄錛屾搷浣滅郴緇熶負浣犳彁渚涗簡涓涓鍔熻兘錛屽綋浣犵殑鏌愪釜socket鎺ユ敹緙撳瓨鍖烘湁鏁版嵁鍙璇伙紝鎴栬呭彂閫佺紦鍐插尯鏈夌┖闂村彲鍐欑殑鏃跺欙紝瀹冨彲浠ョ粰浣犱竴涓閫氱煡銆
榪欐牱褰撻厤鍚堥潪闃誨炵殑socket浣跨敤鏃訛紝鍙鏈夊綋緋葷粺閫氱煡鎴戝摢涓鎻忚堪絎﹀彲璇諱簡錛屾垜鎵嶅幓鎵ц宺ead鎿嶄綔錛屽彲浠ヤ繚璇佹瘡嬈read閮借兘璇誨埌鏈夋晥鏁版嵁鑰屼笉鍋氱函榪斿洖-1鍜孍AGAIN鐨勬棤鐢ㄥ姛銆
鍐欐搷浣滅被浼箋
鎿嶄綔緋葷粺鐨勮繖涓鍔熻兘閫氳繃select/poll/epoll涔嬬被鐨勭郴緇熻皟鐢ㄥ嚱鏁版潵浣跨敤錛岃繖浜涘嚱鏁伴兘鍙浠ュ悓鏃剁洃瑙嗗氫釜鎻忚堪絎︾殑璇誨啓灝辯華鐘跺喌錛岃繖鏍鳳紝澶氫釜鎻忚堪絎︾殑I/O鎿嶄綔閮借兘鍦ㄤ竴涓綰跨▼鍐呭畬鎴愶紝榪欏氨鍙獻/O澶氳礬澶嶇敤錛岃繖閲岀殑鈥滃嶇敤鈥濇寚鐨勬槸澶嶇敤鍚屼竴涓綰跨▼銆傝嚦浜庝簨浠墮┍鍔錛屽叾瀹炴槸I/O澶氳礬澶嶇敤鐨勪竴涓鍙﹀栫殑縐板懠銆傝嚦浜庡紓姝ュ悓姝ワ紝鎴戜滑甯歌佺殑linux涓嬬殑緗戠粶緙栫▼妯″瀷澶ч儴鍒嗛兘鏄鍚屾io錛屼互璇繪搷浣滀負渚嬶紝鏈璐ㄤ笂閮芥槸闇瑕佺敤鎴瘋皟鐢╮ead/recv鍘諱粠鍐呮牳緙撳啿鍖烘妸鏁版嵁璇誨畬鍐嶅勭悊涓氬姟閫昏緫銆
寮傛io鍒欐槸鍐呮牳宸茬粡鎶婃暟鎹璇誨ソ浜嗭紝鐢ㄦ埛鐩存帴澶勭悊閫昏緫銆
寮傛IO鍦╨inux涓嬩竴鑸鏄鐢╝io搴撱
linuxaccept()鍑芥暟涓鐩村勪簬闃誨炵姸鎬,浠涔堝師鍥狅紵
accept錛堬級鍑芥暟灝辨槸闃誨炵殑鍟婏紝瑕佺瓑寰呮帴鏀跺埌鏈夊㈡埛絝璇鋒眰鎵嶅彲浠ヨ繘琛屽悗緇鐨勬搷浣滐紝浣犳墍璋撶殑涓嶅彲浠ユ槸鎸囦粈涔堬紵
open緋葷粺浣跨敤鎶宸э紵
open緋葷粺鏄澶氱嶈璦銆佺幆澧冪殑涓縐嶅嚱鏁般
LINUX涓璷pen鍑芥暟浣滅敤錛氭墦寮鍜屽壋寤烘枃浠躲侾B紼嬪簭璇璦涓璷pen鍔熻兘錛氭墦寮紿楀彛銆
瀵逛簬open緋葷粺鏉ヨ達紝絎涓変釜鍙傛暟浠呭綋鍒涘緩鏂版枃浠舵椂錛堝嵆浣跨敤浜哋_CREAT鏃訛級鎵嶄嬌鐢錛岀敤浜庢寚瀹氭枃浠剁殑璁塊棶鏉冮檺浣嶃
pathname鏄寰呮墦寮/鍒涘緩鏂囦歡鐨凱OSIX璺寰勫悕錛沠lags鐢ㄤ簬鎸囧畾鏂囦歡鐨勬墦寮/鍒涘緩妯″紡錛岃繖涓鍙傛暟鍙鐢變互涓嬪父閲忛氳繃閫昏緫浣嶆垨閫昏緫鏋勬垚銆
鎵撳紑/鍒涘緩鏂囦歡鏃訛紝鑷沖皯寰椾嬌鐢ㄤ笂榪頒笁涓甯擱噺涓鐨勪竴涓銆
浠ヤ笅甯擱噺鏄閫夌敤鐨勶細
1.璁劇疆涓洪潪闃誨炴ā寮
2.浠ヤ笅涓変釜甯擱噺鍚屾牱鏄閫夌敤鐨勶紝瀹冧滑鐢ㄤ簬鍚屾ヨ緭鍏ヨ緭鍑
3.open榪斿洖鐨勬枃浠舵弿榪扮︿竴瀹氭槸鏈灝忕殑鏈琚浣跨敤鐨勬弿榪扮︺