再談程序 從入門到出家

2021-10-07 14:16:40 字數 4974 閱讀 6633

這段時間由於工作上用到幾個比較基礎的程序程式設計,卻發現自己好久沒有接觸程序了,都狂忘了!不得不感慨幾句:老了老了~~~

趁著對程序的回憶,也總乙個簡單的總結,下次可以回頭看看,也幫大家做乙個回顧

這篇文章就叫——再談程序—從入門到出家

建立程序

建立程序使用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:指明了所要處理的訊號型別,它可以取除了sigkillsigstop外的任何一種訊號。   第二個引數handler:描述了與訊號關聯的動作,它可以取sig_ignsig_dflsighandler_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中的儲存方式和其在程式中的儲...