新聞中心
小眾技巧:使用Linux C中的暫停語句提高程序運行效率!

十多年建站經(jīng)驗, 網(wǎng)站設(shè)計、網(wǎng)站制作客戶的見證與正確選擇。成都創(chuàng)新互聯(lián)提供完善的營銷型網(wǎng)頁建站明細報價表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。
在軟件開發(fā)中,提高程序運行效率一直是程序員們追求的目標(biāo)之一。在Linux C編程中,有許多技巧可以提高程序的運行效率,其中使用暫停語句可以說是一個小眾技巧,但是卻非常有效。本文將會介紹什么是暫停語句,暫停語句的實現(xiàn)方式,以及如何有效地將暫停語句應(yīng)用于Linux C的程序開發(fā)中。
一、什么是暫停語句?
在Linux C中,暫停語句指的是通過系統(tǒng)調(diào)用sleep()來實現(xiàn),該函數(shù)的主要作用是使當(dāng)前進程暫停一段時間,讓出CPU的使用權(quán),以避免CPU的占用過度,從而達到提高程序運行效率的目的。當(dāng)程序執(zhí)行到sleep()函數(shù)時,程序會進入阻塞狀態(tài),等待固定的時間后再次運行。
二、暫停語句的實現(xiàn)方式
在Linux C編程中,實現(xiàn)暫停語句非常簡單,只需要調(diào)用sleep()函數(shù)即可。例如,下面的示例代碼展示了如何使用sleep()函數(shù)創(chuàng)建一個簡單的暫停程序:
#include
#include
int mn()
{
printf(“Begin Pause\n”);
sleep(10);
printf(“End Pause\n”);
return 0;
}
在上面的代碼中,我們調(diào)用了sleep()函數(shù),并傳遞了一個參數(shù)10,表示程序暫停10秒鐘。在執(zhí)行到sleep()函數(shù)時,程序會睡眠10秒鐘,然后打印出”End Pause”這句話。這個示例程序非常簡單,但是卻可以讓我們清楚地看到暫停語句的實現(xiàn)方式。
除了使用sleep()函數(shù)之外,還有一些其他的方法可以實現(xiàn)暫停語句。例如,我們可以使用usleep()函數(shù)來實現(xiàn)微秒級的暫停操作,也可以使用nanosleep()函數(shù)來實現(xiàn)納秒級的暫停操作。
三、如何有效地應(yīng)用暫停語句于Linux C程序開發(fā)中
雖然暫停語句可以提高程序的運行效率,但是過度地使用暫停語句會導(dǎo)致程序變慢或者出現(xiàn)諸如卡頓等問題。因此,在Linux C程序開發(fā)中,應(yīng)該合理地應(yīng)用暫停語句,從而達到更好的效果。
下面是一些使用暫停語句的小技巧:
1. 合理地設(shè)置暫停時間
在Linux C編程中,應(yīng)該合理地設(shè)置暫停時間,避免浪費CPU時間。如果暫停時間過短,程序可能會頻繁地調(diào)用sleep()函數(shù),從而浪費CPU時間;如果暫停時間過長,程序可能會變慢或者出現(xiàn)諸如”卡頓”等問題。因此,我們應(yīng)該根據(jù)具體情況來確定暫停時間。
2. 避免在循環(huán)中過度使用暫停語句
在使用暫停語句時,應(yīng)該避免在循環(huán)中過度使用,否則會導(dǎo)致程序變慢。應(yīng)該僅在必要時使用暫停語句。
3. 考慮使用其他的調(diào)度機制
在某些情況下,應(yīng)該考慮使用其他的調(diào)度機制,例如信號和定時器。這些機制可以實現(xiàn)和暫停語句類似的功能,但是更為靈活和高效。
小結(jié)
相關(guān)問題拓展閱讀:
- Linux C中的Socket,shutdown函數(shù)和close函數(shù)有什么不同
- 求解答,“l(fā)inux中終端控制鍵Ctrl+C,Ctrl+Z,Ctrl+D的使用場合”
Linux C中的Socket,shutdown函數(shù)和close函數(shù)有什么不同
shutdown并不蘆則臘會關(guān)閉socket decriptor,只是改變其工作方式盯余。而close則會釋放陪滑這個socket。
假設(shè)server和client 已經(jīng)建立了連接,server調(diào)用了close, 發(fā)送FIN 段給client(其實不一定會發(fā)送FIN段,后面再說),此時server不能再通過
socket發(fā)送和接收數(shù)據(jù),此時client調(diào)用read,如果接收到FIN 段會返回0,但client此時還是可以write 給server的,write調(diào)用只負責(zé)把數(shù)據(jù)交給TCP
發(fā)送緩沖區(qū)就可以成功返回了,所以不會出錯,而server收到數(shù)據(jù)后應(yīng)答一個RST段,表示服務(wù)器已經(jīng)不能接收數(shù)據(jù),連接重置,client收到RST段后無
法立刻通知應(yīng)用層,只把這個狀態(tài)保存在TCP協(xié)議層。如果client再次調(diào)用攔枝跡write發(fā)數(shù)據(jù)給server,由于TCP協(xié)議層已經(jīng)處于RST狀態(tài)了,因此不會將數(shù)據(jù)
發(fā)出,而是發(fā)一個SIGPIPE信號給應(yīng)用層,SIGPIPE信號的缺省處理動作是終止程序。
有時候代碼中需要連續(xù)多次調(diào)用write,可能還來不及調(diào)用read得知對方已關(guān)閉了連接就被SIGPIPE信號終止掉了,這就需要在初始化時調(diào)用sigaction處
理SIGPIPE信號,對于這個信號的處理我們通常忽略即可,signal(SIGPIPE, SIG_IGN); 如果SIGPIPE信號沒有導(dǎo)致進程異常退出,write返回-1并且
errno為EPIPE。
#include
intclose(int fd);
close 關(guān)閉了自身數(shù)據(jù)傳輸?shù)膬蓚€方向。
#include
intshutdown(int sockfd, int how);
shutdown 可以選擇關(guān)閉某個方向或者同時關(guān)閉兩個方向,shutdownhow = 1 or how = 2 (SHUT_WR or SHUT_RDWR),可以保證對等方接收到一個EOF字符(即發(fā)送了一個FIN段),而不管其他進程是否已經(jīng)打開了這個套接字。而close不能保證,只有當(dāng)某個sockfd的引用計數(shù)為0,close 才會發(fā)送FIN段,否則只是將引用計數(shù)減1而已。也就是說只有當(dāng)所有進程(可能fork多個子進程都打開了這個套接字)都關(guān)閉了這個套接字,close 才會發(fā)送FIN段。
所以說,如果是調(diào)用shutdown how = 1 ,則意味著往一個已經(jīng)接收FIN的套接字中寫是簡并允許的,接收到FIN段僅代表對方不再發(fā)送數(shù)據(jù),但對方還是可以讀取數(shù)據(jù)的,可以讓對方可以繼續(xù)讀取緩沖區(qū)剩余的數(shù)據(jù)。
下面使用shutdown 修改客戶端程序,在前面講過的使用select函數(shù)修改后的客戶端程序基礎(chǔ)上,修改很小一部分:
C++ Code
if (FD_ISSET(fd_stdin, &rset))
{
if (fgets(sendbuf, sizeof(sendbuf), stdin)== NULL)
{
stdineof = 1; //表示已經(jīng)輸入完畢
/* 關(guān)閉sock的寫端,還能夠接收數(shù)據(jù),在sock的緩沖區(qū)末尾添加一個FIN段 */
shutdown(sock, SHUT_WR);
}
else
{
writen(sock, sendbuf, strlen(sendbuf));
memset(sendbuf, 0, sizeof(sendbuf));
}
}
為了測試我們想要的效果,需要在select函數(shù)修改后的服務(wù)器端程序的 134 行代碼之后,即writen 之前 sleep(4); 目的是接收到客戶端數(shù)據(jù)后搭帶不馬
上回射回去,睡眠4s 后在客戶端已經(jīng)關(guān)閉連接的情況下再發(fā)送數(shù)據(jù)。
先運行服務(wù)器端程序,再運行客戶端程序,在客戶端標(biāo)準(zhǔn)輸入,迅速敲入兩行:AAAAA\n BBBBB\n 然后按下ctrl+d 即fgets 會返回NULL,然后調(diào)用
shutdown關(guān)閉寫端,雖然服務(wù)器端延時才發(fā)送數(shù)據(jù),此時客戶端寫端已經(jīng)關(guān)閉,但還是可以讀取到回射回來的數(shù)據(jù),服務(wù)器端最后得到一個FIN段,read
返回0,打印輸出 client close ,并且close(conn); 而客戶端在讀取服務(wù)端回射回來的兩次數(shù)據(jù)后,再次read 也返回0,故打印 server connect
close,break退出循環(huán),進程順利退出。從下面的輸出還可以看出,因為延時的關(guān)系,所以不像以前那樣發(fā)射一行就回射一行。
simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$./echoser_select
recv connect ip=127.0.0.1 port=54010
fdsgfgd
gfedg
client close
………………………
simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$./echocli_select_shutdown
local ip=127.0.0.1 port=54010
fdsgfgd
gfedg
fdsgfgd
gfedg
gfedg
server connect close
如果我們將客戶端程序中的shutdown 改成了 close,那么當(dāng)延時后服務(wù)器端發(fā)送數(shù)據(jù)給客戶端時,客戶端的讀端和寫端都已經(jīng)關(guān)閉,之一次發(fā)AAAAA會
返回一個RST段,根據(jù)本文前面所說,再次發(fā)BBBBB直接產(chǎn)生SIGPIPE信號,默認會終止進程,但因為我們已經(jīng)設(shè)置了忽略SIGPIPE信號,所以服務(wù)器端進
程不會被終止,但客戶端也會出錯,因為回到while循環(huán)開頭,select阻塞等待時發(fā)現(xiàn)套接字的讀端已經(jīng)關(guān)閉,所以不能再關(guān)心可讀事件了,select會返
回-1,錯誤碼是 EBADF: Bad File Descriptor。
老問題了。網(wǎng)上有人說的挺清楚的,請百度“socket shutdown close區(qū)別”。
求解答,“l(fā)inux中終端控制鍵Ctrl+C,Ctrl+Z,Ctrl+D的使用場合”
C=Close
Z=Pause
D=Delete
呵呵 這幾個快捷鍵的確很相似,但是功能又不相同,簡單說下:
1、Ctrl+C比較暴力,就是發(fā)送Terminal到當(dāng)前搭巧的程序,比如你正在運行一個查找功能,文件正在查找中,Ctrl+C就會強制結(jié)束當(dāng)前的這個進程。
2、Ctrl+Z是把當(dāng)前的程序掛起,暫停執(zhí)行這知滾鍵個程序,比如你正在mysql終端中,需要出來搞點其他的文件操作,又不想退出mysql終端(因為下次還得輸入用戶名密碼進入,挺麻煩),于是可以ctrl+z將mysql掛起,然后進行其他操作,然后輸入fg回車后就可以回來,當(dāng)然可以掛起好多進程到后臺,然后fg 加備洞編號就能把掛起的進程返回到前臺。當(dāng)然,配合bg和fg命令進行前后臺切換會非常方便。
3、Ctrl+D 是發(fā)送一個exit信號,沒有那么強烈,類似ctrl+C的操作,比如你從管理員root退回到你的普通用戶就可以這么用。
Good Luck~~
Ctrl+C 終止一個程序的運行,如:你不想繼續(xù)當(dāng)前程序的運行,可以用這個命令終渣賣液止,回配鍵到提如物示符下。
Ctrl+Z 掛起一個當(dāng)前運行的程序
Ctrl+D 退出當(dāng)前的SHELL,相當(dāng)于exit命令
關(guān)于linux c 暫停語句的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器托管選創(chuàng)新互聯(lián),先上架開通再付費。
創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)-網(wǎng)站建設(shè),軟件開發(fā)老牌服務(wù)商!微信小程序開發(fā),APP開發(fā),網(wǎng)站制作,網(wǎng)站營銷推廣服務(wù)眾多企業(yè)。電話:028-86922220
當(dāng)前名稱:小眾技巧:使用linux c中的暫停語句提高程序運行效率! (linux c 暫停語句)
標(biāo)題網(wǎng)址:http://www.5511xx.com/article/coidsji.html


咨詢
建站咨詢
