這段時間由於工作上用到幾個比較基礎的程序程式設計,卻發現自己好久沒有接觸程序了,都狂忘了!不得不感慨幾句:老了老了~~~
趁著對程序的回憶,也總乙個簡單的總結,下次可以回頭看看,也幫大家做乙個回顧
這篇文章就叫——再談程序—從入門到出家
建立程序建立程序使用
fork()
函式,由fork
函式建立的程序被稱為子程序
;
#include
pid_t fork(void);
注:fork
函式被呼叫一次,但是返回兩次,唯一的區別就是子程序的返回值是0,父程序的返回值則是新子程序的id;
子程序是父程序的副本,子程序可以獲得父程序的資料空間,堆和棧的副本,但是父子程序並不共享這些儲存空間,父子程序共享這些正文段;
案例:
#include
#include
intmain
()if(pid == 0)
else
for(;n>0;n--)
return0;}
看下結果:
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/progress# ./fork
this is the parent
this is the child
this is the parent
this is the child
this is the parent
this is the child
this is the child
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/progress# this is the child
this is the child
父程序執行了三次,子程序執行了6次;
wait() 函式首先,看一下
wait()
函式的原型;
#include
intwait
(int *status)
函式功能:父程序一旦呼叫了wait就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait就會收集這個子程序的資訊,並把它徹底銷毀後返回;如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止;
測試一
#include
#include
#include
intmain
()if(pid == 0)
else
return0;}
結果:
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/progress# ./fork1
this is the child,pid=20334
this is the parent
out,20334
我們再次測試下,子程序一直不退出,看下父程序會不會結束:
測試二**:
#include
#include
#include
intmain
()if(pid == 0)
//exit(5);
}else
return0;}
結果:
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/progress# ./fork1
this is the child,pid=20344
this is the parent
this is the child,pid=20344
this is the child,pid=20344
^c
我們會發現wait
函式起到了作用,一直阻塞等待子程序的結束,這樣就不會產生殭屍程序;
程序還有很多知識,這個是最最基礎的:
比如程序間通訊:
訊號概念:
訊號(signal)是linux
程序通訊中唯一的非同步通訊方式
訊號從軟體層次上看是對中斷機制的一種模擬。乙個程序收到訊號時的處理方式與cpu收到中斷請求時的處理方式一樣。收到訊號的程序會跳入訊號處理函式,執行完後再跳回原來的位置繼續執行
想必這個學過底層硬體的對這個很熟悉,比如微控制器時鐘中斷等等,就是通過中斷的方式去處理事件,然後返回;
訊號處理方式:
首先看幾個常用的訊號
訊號註冊函式函式原型:
#include
typedef
void
(*sighandler_t)
(int)
;sighandler_t signal(int signum, sighandler_t handler);
第乙個引數signum:指明了所要處理的訊號型別,它可以取除了sigkill
和sigstop
外的任何一種訊號。 第二個引數handler:描述了與訊號關聯的動作,它可以取sig_ign
、sig_dfl
、sighandler_t
型別的函式指標
直接上案例:
訊號案例一
#include
#include
intmain
()return ;
}
結果:
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/signal# ./signal1
^c^c
^\quit
這個使用了sig_ign
表示忽略了sigint
,也就是ctrl+c
無效;
訊號案例二
#include
#include
intmain
()return ;
}
結果:
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/signal# ./signal
^c
這裡使用了訊號sig_dfl
,表示了預設使用ctrl+c
,一般我們會使用預設的,但是在一些特定情況下,我們會使用這個來恢復預設操作的;
訊號案例三
#include
#include
void
fun(int signum)
intmain
()return ;
}
結果:
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/signal# ./signal3
^crecv a signal,num is 2
^crecv a signal,num is 2
^crecv a signal,num is 2
^crecv a signal,num is 2
^\quit
這裡其實改變了我們對訊號sigint
的使用,當我們使用ctrl+c
的時候,會執行我們自己定義的函式,但是同時,他的預設函式也會被我們函式所取代;
訊號案例四
#include
#include
#include
#include
void
alarm_fun
(int signum)
intmain
()
結果:
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/signal# ./signal4
10num:10
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/signal# ./signal4
alarm out,signum = 14
root@izuf67on1pthsuih96udyfz:~/c++/c++_test/signal#
這段**使用了sigalrm
訊號,一般會搭配alarm
函式一起使用,alarm
函式會在時間到達後產生sigalrm
訊號,當前程序捕獲該訊號,進入函式進行處理;如果我們這裡將exit
去掉,函式處理完成後,優惠再次回到當前程序中,繼續等待輸入,但是不會再次計時;
總結
往期精彩彙總冰凍三尺,非一日之寒,水滴石穿,非一日之功,願我們一起加油努力~
機器學習從入門到出家
作者 張紅林 編輯 顧鄉 本文主要介紹的是自己的一些經歷,以及讀過的一些書,實際應用的經驗並沒有介紹,包括現在很多機器學習的書一般也是側重於理論,結合實踐的時候會發現和模型比起來,資料清洗 特徵工程的實際效果更明顯,而這方面很難有系統的理論知識,怎麼辦呢?讀 去搜尋自己應用領域有關的 大公司的經典的...
2 分支語句 《Swift3 0 從入門到出家》
2 分支語句 if 選擇語句 格式 if 判斷條件else 如果判斷條件為真,就會執行語句塊1的內容整個if語句結束 如果判斷條件為假,直接執行語句塊2的內容 if else if else if 判斷條件1 else if 判斷條件2 else 注意 else語句可以預設 switch 多分支語句...
Redis從入門到入門
2安裝1.1支援的儲存結構 remote dictionary server 以字典儲存資料,允許其他應用通過tcp協議訪問字典內容。支援的鍵值型別 優點 redis的字典儲存方式和多重鍵值儲存方式,使得程式設計師可以直接將程式中的資料對映到redis中,資料在redis中的儲存方式和其在程式中的儲...