unix環境高階程式設計 讀書筆記
第8章exit和_exit區別:_exit會直接進入核心,不會關閉io流。程序基本控制函式還有:wait,fork,exec。
atexit:程式正常退出時呼叫,如果因為signal退出則不能呼叫。功能:註冊函式可以完成一些清理工作,比如全域性log類,可以不設定析構函式,最後在atexit裡刪除它,防止它被呼叫時已經被析構。
longjmp,跳轉後,會恢復暫存器的值
每個程序都有父程序,如果父程序退出了,則他的父進id變為1,即init程序;如果子程序終止,父程序麼有呼叫wait,則該程序變為殭屍程序;子程序終止,父程序會受到sigchld訊號,預設是選擇忽略(在unix98和systemv下子程序也不會變成殭屍,但是posix規定需要呼叫wait);
accton可以開啟會計程序,統計程序的執行時資料;times可以獲取當前cup時間和使用者時間,是時間戳
第9章sigtstp訊號可以使程序暫停,傳送sigcount能使他繼續執行
在終端輸入ctrl+c會傳送sigint訊號,終止前台程序,但是當回話結束時,會傳送sighup,前端程序和所有向終端輸出後的段程序都會終止
sigpipe,如果對方關閉,傳送方會受到乙個rst響應報文報文,如果繼續write,則會收到sigpipe訊號。
第10章
sigstop和sigkill不可**捉和忽略
在慢系統呼叫阻塞過程中,如果程序捕捉到乙個訊號,就會中斷系統呼叫,同時errno被設定為eintr
可以遮蔽訊號,既阻塞訊號的投遞
sigsupend(mask),設定訊號遮蔽為mask,並且掛起等待乙個訊號,直到訊號觸發後執行完處理程式。
第12章
低速系統呼叫:使系統永遠阻塞,讀寫檔案呼叫不屬於這種;
多個程序寫乙個檔案,可以加記錄所recrod_lock
dup2可以把乙個檔案控制代碼負債到標準輸出,這樣輸出到螢幕的內容就寫入檔案了。
由fork產生的子程序不繼承父程序的鎖,因為一旦整合了,子程序就可以和父程序訪問同乙個檔案了。
對於乙個檔案,fork產生的子程序和父程序公用乙個檔案表項,因為fd是一樣的。這樣父子程序共享檔案位移;
dup 複製的fd,和原fd用用乙個檔案表項;
兩次open同乙個檔案,返回的2個fd不公用乙個檔案表項 ,因為檔案表項裡有檔案的開啟標誌和位移,這兩次open是用不同的方式開啟的,也有不同的檔案位移,所以不能公用乙個檔案表項。
記錄鎖是掛在i節點上的,因此關閉檔案控制代碼,該程序就會釋放加在檔案上的鎖
可以用記錄鎖對乙個檔案加鎖,從而做到乙個程式只啟動乙個程序,該程序不管是否正常消亡,都會釋放檔案描述符從而釋放鎖。
建議性鎖和強制性鎖的區別。建議性鎖只大家按照相同的規則去訪問資料,比如都先try_lock 然後 write,最後un_lock,但是如果有程序不try_lock直接寫檔案破壞了規則,寫亂了檔案。
因此誕生了強制性鎖,使用強制性鎖需要開啟檔案的某些標誌位。
select 和poll 區別:poll不會破壞傳入的ft_set引數
第14章
pipe 建立的管道是半雙工的,並且只能在具有共同祖先的程序間通訊。但是fifo,即命名管道可以在兩個不相關的程序間通訊。
fd = open() fp = fdopen(fp) fp = fileno(fd)
fp = fopen()
引用pipe的程序全部終結時,pipe也被刪除;但是fifo不會刪除,雖然fifo中的內容已被刪除掉,需要顯示呼叫命令刪除fifo; shm,msg,seg沒有引用計數,會一直存在,直到用命令刪除。
執行緒同步:
pthread_mutex_lock(&qlock) /lock/
pthread_cond_wait(&qready, &qlock) /block–>unlock–>wait()||(喚醒之後)return–>lock/
pthread_mutex_unlock(&qlock) /unlock/
pthread_cond_signal(&qready) 也最好放在lock和unlock之間,如果放在unlock後,可能鎖會被另乙個執行緒搶去,導致signal通知的執行緒獲取不到鎖進入等待狀態。
第12章
程序id在系統中是唯一的,但是執行緒id只有在他所屬的程序環境才有意義。
程序中任意執行緒呼叫exit或者_exit,都有導致整個程序退出。執行緒退出可以1)等執行緒函式執行完,2)或者呼叫pthread_exit(void *ptr),3)或者被其他執行緒取消pthread_cancel(threadid),該函式僅僅提出請求,並不等執行緒終結。
pthread_join(threadid, void**ptr1) 1)ptr執行返回碼,2)ptr1指向ptr, 3)ptr指向內容為pthread_canceled;
1)執行緒呼叫pthread_exit(), 2)或者相應取消請求,3)或者用非0值呼叫pthread_cleanup_pop(execute)時,會觸發呼叫由pthread_clean_push()壓棧的清理函式。如果正常return,清理函式就不會被呼叫。
因為函式是壓在棧上,所以 在push和pop之間如果有返回,相當於棧被破壞,所以一定要呼叫pthread_exit退出。
pthread_detach(threadid),分離執行緒,分離後就不能呼叫pthread_join了,也不需要呼叫了,執行緒執行完系統會自動釋放資源。
pthread_mutex_init()
pthread_***atr_init()在完成初始化,並呼叫了pthread_mutex_init()後,需要呼叫pthread_***atr_destory()進行attr的釋放。
當讀寫鎖處於讀模式pthread_rdlock_rdlock,有寫鎖嘗試獲取鎖時,後續的讀鎖都會阻塞,防止讀鎖長期占用。
自旋鎖(pthread_spin_lock)與互斥所差異:不會因為阻塞進入睡眠狀態,而是一直忙等阻塞狀態,這適合鎖的持有時間段,並且不希望執行緒在重新排程上花費太多時間的狀況。
用屏障pthread_barrier_wait()可以等待多個程序同時到達某個點。
如果乙個函式可以被多個執行緒重入,就說這個函式是執行緒安全的(比如getenv不是執行緒安全),執行緒安全不代表非同步訊號處理程式重入是安全的。
如果為了執行緒安全,在getenv裡加鎖,而訊號處理程式也呼叫了getenv這時候就會死鎖,所以需要把鎖設定為迴圈鎖。
多個程序訪問同一檔案,可以用flockfile(file*),他是可以迴圈加鎖的;注意它與記錄鎖的區別。
errno是執行緒私有資料,不會被其他執行緒改寫。
執行緒特定資料,鍵只需要建立一次,然後每個執行緒都能根據該鍵去讀寫自己的特定資料。
訊號處理是程式是多個執行緒共享的,如果乙個執行緒改了訊號的處理方式,其他執行緒也會跟著改變。但是訊號發生後是投遞到單個執行緒的,如果訊號與硬體故障有關,則投遞給引起該訊號的執行緒,其他情況下投遞給任意執行緒。
如果多個執行緒呼叫sigwait處於阻塞狀態,訊號發生後,只有乙個執行緒會從sigwait中返回。如果程序通過sigaction建立了訊號處理函式。則與作業系統來決定是讓sigwait返回,或者是呼叫訊號處理函式。
sigwait可以簡化訊號處理,化非同步為同步:1)先設定訊號遮蔽,會對所有執行緒生效,2)讓乙個執行緒呼叫sigwait,它會立刻解除阻塞並且等待訊號發生,以後所有訊號發生後都有該執行緒處理了。
呼叫pthread_create()建立的新執行緒繼承呼叫者的訊號遮蔽字,然後在新執行緒呼叫sigwait,這樣新執行緒就成為了執行緒訊號專用處理函式。
pread是原子的,保證lseek和read同時執行。
第14章
呼叫close()關閉socket,接收緩衝區無資料,會給對方傳送fin標誌,或者呼叫shutdown(shut_wr),傳送完緩衝區資料後,會緊接著傳送fin標誌
呼叫close()關閉socket,接收緩衝區有資料,直接給對方傳送rst標誌
呼叫close,前端收到fin,read返回0;如果呼叫write,會收到rst錯誤,如果繼續讀會返回rst錯誤,繼續寫會發生epipe錯誤;收的rst後,如果繼續讀,會返回econnectrest錯誤
sock_dgram套接字也可以呼叫connect,這樣所有報文都傳送給改位址,不需要再為每個資料報單獨設定位址;同時也只能接受來自改位址的報文
unix環境高階程式設計 讀書筆記
檔案 unix支援在不同程序之間共享開啟的檔案。核心使用三種資料結構表示開啟的檔案 原子操作 一般而言,原子操作指的是由多步組成的操作。如果該操作原子的執行,要麼執行完所有步,要麼一步也不執行,不可能只執行所有步驟的乙個子集。2 注意 原子操作函式 pread,pwrite pread 相當於呼叫r...
Unix環境高階程式設計 讀書筆記一
unix 基礎知識 這一章主要是unix系統的概論以及一些概念的介紹,主要分為10個小節 1 登陸 2 檔案和目錄 3 輸入和輸出 4 程式和程序 5 ansi c 6 出錯處理 7 使用者標識 8 訊號 9 unix時間值 10 系統呼叫和庫函式 這個都比較簡單,就不再重複敘述了。在標頭檔案中定義...
UNIX高階環境程式設計讀書筆記(chapter4)
chapter 4 檔案和目錄 4.0.給定乙個pathname 1 stat函式返回乙個與此命名有關的資訊結構.2 fstat函式獲得已在描述符filedes上開啟的檔案的有關資訊.3 lstat函式類似於stat,但是當命名的檔案是乙個符號鏈結時,lstat返回該符號鏈結的有關資訊,而不是由該符...