新聞中心
Linux系統(tǒng)如何設(shè)置超時(shí)時(shí)間

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供比如企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、html5、小程序制作等業(yè)務(wù)。10年已為比如眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
Linux系統(tǒng)是一種免費(fèi)開(kāi)源的操作系統(tǒng),在服務(wù)器應(yīng)用、嵌入式應(yīng)用等領(lǐng)域廣泛應(yīng)用。在Linux系統(tǒng)中,設(shè)置超時(shí)時(shí)間是一項(xiàng)非常重要的任務(wù)。本文將介紹如何在Linux系統(tǒng)中設(shè)置超時(shí)時(shí)間。
一、為什么需要設(shè)置超時(shí)時(shí)間
在Linux系統(tǒng)中,很多場(chǎng)景需要設(shè)置超時(shí)時(shí)間,比如:
1. 網(wǎng)絡(luò)請(qǐng)求超時(shí):在進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),如果請(qǐng)求過(guò)程耗時(shí)過(guò)長(zhǎng),就需要設(shè)置超時(shí)時(shí)間,避免一直等待下去。
2. 系統(tǒng)運(yùn)行超時(shí):在測(cè)試或調(diào)試時(shí),需要設(shè)置超時(shí)時(shí)間,確保系統(tǒng)能夠在指定時(shí)間內(nèi)完成運(yùn)行任務(wù)。
3. 程序運(yùn)行超時(shí):如果某個(gè)程序在運(yùn)行時(shí),發(fā)生了異常情況,需要設(shè)置超時(shí)時(shí)間,避免進(jìn)程一直停留在錯(cuò)誤狀態(tài)。
二、如何設(shè)置超時(shí)時(shí)間
在Linux系統(tǒng)中,有多種方法可以設(shè)置超時(shí)時(shí)間,下面介紹兩種主要的方法:
1. 設(shè)置超時(shí)時(shí)間的系統(tǒng)調(diào)用
在Linux系統(tǒng)中,有一些系統(tǒng)調(diào)用可以用來(lái)設(shè)置超時(shí)時(shí)間,包括sleep、usleep、nanosleep和select等。這些系統(tǒng)調(diào)用的使用方法如下:
1. sleep
sleep函數(shù)的原型如下:
unsigned int sleep(unsigned int seconds);
該函數(shù)會(huì)使當(dāng)前進(jìn)程掛起指定的時(shí)間,并且當(dāng)超時(shí)時(shí)間到達(dá)后,會(huì)返回0。
2. usleep
usleep函數(shù)的原型如下:
int usleep(useconds_t usec);
該函數(shù)會(huì)使當(dāng)前進(jìn)程掛起指定的微秒數(shù),并且當(dāng)超時(shí)時(shí)間到達(dá)后,會(huì)返回0。
3. nanosleep
nanosleep函數(shù)的原型如下:
int nanosleep(const struct timespec *req, struct timespec *rem);
該函數(shù)會(huì)使當(dāng)前進(jìn)程掛起指定的納秒數(shù),并且當(dāng)超時(shí)時(shí)間到達(dá)后,會(huì)返回0。
4. select
select函數(shù)的原型如下:
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
該函數(shù)用于監(jiān)視多個(gè)文件描述符的狀態(tài),并且等待其中的一個(gè)或多個(gè)描述符發(fā)生變化時(shí)才返回。
2. 使用timeout命令
timeout是Linux系統(tǒng)中的一個(gè)命令行工具,可以用來(lái)設(shè)置進(jìn)程的超時(shí)時(shí)間。timeout命令的使用方法如下:
timeout [-signal] seconds command [arg…]
其中,-signal參數(shù)表示在超時(shí)發(fā)生后,要發(fā)送到進(jìn)程的信號(hào)。如果不指定該參數(shù),則默認(rèn)發(fā)送SIGTERM信號(hào)。seconds參數(shù)表示進(jìn)程的超時(shí)時(shí)間,command表示要運(yùn)行的程序,arg表示運(yùn)行程序的參數(shù)。
例如,要在Linux系統(tǒng)中設(shè)置一個(gè)進(jìn)程的超時(shí)時(shí)間為10秒,可以使用如下命令:
timeout 10s your_program
三、
在Linux系統(tǒng)中,設(shè)置超時(shí)時(shí)間是一項(xiàng)非常重要的任務(wù),可以幫助我們更好地控制系統(tǒng)運(yùn)行的時(shí)間,增加系統(tǒng)的穩(wěn)定性和可靠性。本文介紹了兩種主要的設(shè)置超時(shí)時(shí)間的方法,希望讀者可以在實(shí)際的工作中靈活運(yùn)用。
相關(guān)問(wèn)題拓展閱讀:
- linux socket 連接超時(shí) 怎么解決
linux socket 連接超時(shí) 怎么解決
今天發(fā)現(xiàn)自己的系統(tǒng)存在很?chē)?yán)重缺陷,當(dāng)前臺(tái)關(guān)閉的時(shí)候后臺(tái)就無(wú)法正常工作,原因很好定位,后臺(tái)的socket連接超時(shí)時(shí)間過(guò)長(zhǎng),系統(tǒng)默認(rèn)時(shí)間好像是75秒,于是找資料,根據(jù)下邊文章中的內(nèi)容解決了,把超時(shí)時(shí)間設(shè)為5秒后,感覺(jué)好多了??磥?lái)還有好多東西需要慢慢挖掘阿!
如何設(shè)置socket的Connect超時(shí)(linux)
1.首先將標(biāo)志位設(shè)為Non-blocking模式,準(zhǔn)備在非阻塞模式下調(diào)用connect函數(shù)
2.調(diào)用connect,正常情況下,因?yàn)門(mén)CP三次握手需要一些時(shí)間;而非阻塞調(diào)用只要不能立即完成就會(huì)返回錯(cuò)誤,所以這里會(huì)返回EINPROGRESS,表示在建立連接但還沒(méi)有世晌完成。
3.在讀套接口描述符集(fd_set rset)和寫(xiě)套接口描述符集(fd_set wset)中將當(dāng)前套接口置位(用FD_ZERO()、FD_SET()宏),并設(shè)置好超時(shí)時(shí)間(struct timeval *timeout)
4.調(diào)用select( socket, &rset, &wset, NULL, timeout )
返回0表示connect超時(shí)
如果你設(shè)置的超時(shí)時(shí)間大于75秒就沒(méi)有必要這樣做了,因?yàn)閮?nèi)核中對(duì)connect有超時(shí)限制就是75秒。
網(wǎng)絡(luò)編程中socket的分量我想大家都很清楚了,socket也就是套接口,在套接口編程中,提到超時(shí)的概念,我們一下子就能想到3個(gè):發(fā)送超時(shí),接收超時(shí),以及select超時(shí)(注: select函數(shù)并不是只用于套接口的,但是套接口編程中用的比較多),在connect到目標(biāo)主機(jī)的時(shí)候,這個(gè)超時(shí)是不由我們來(lái)設(shè)置的。不過(guò)正常情況下這個(gè)超時(shí)都很長(zhǎng),并且connect又是一個(gè)阻塞方法,一個(gè)主機(jī)不能連接,等著connect返回還能忍受,你的程序要是要試圖連接多個(gè)主機(jī),恐怕遇到多個(gè)不能連接的主機(jī)的時(shí)候,會(huì)塞得你受不了的。我也廢話(huà)少說(shuō),先說(shuō)說(shuō)我的方法,如果搜胡鋒你覺(jué)得你已掌握這種方法,你就不用再看下去了,如果你還不了解,我愿意與你分享。本文是已在Linux下的程序?yàn)槔?,不過(guò)拿到Windows中方法也是一樣,無(wú)非是換幾個(gè)函數(shù)名字罷了。
Linux中要給connect設(shè)置超時(shí),應(yīng)該是有兩種方法的。一種是該系統(tǒng)的一些參數(shù),這個(gè)方法我不講,因?yàn)槲抑v不清楚:P,它也不是編程實(shí)現(xiàn)的。另外一種方法就是變相的實(shí)現(xiàn)connect的超時(shí),我要講的就是這個(gè)方法,原理上是這樣的:
1.建立socket
2.將該socket設(shè)置為非阻塞模式
3.調(diào)用connect()
4.使用select()檢查該socket描述符是否可寫(xiě)(注意,是可寫(xiě))
5.根據(jù)select()返回的結(jié)果判斷connect()結(jié)果
6.將socket設(shè)置為阻塞模式(如果你的程序不需要用阻塞模式的,這步就省了,不過(guò)一般情況下都是用阻塞模式的,這樣也容易管理)
如果你對(duì)網(wǎng)絡(luò)編程很熟悉的話(huà),其實(shí)我一說(shuō)出這個(gè)過(guò)程你就知道怎么寫(xiě)你的程序了,下面給出我寫(xiě)的一段程序,僅供參考。
/******************************
* Time out for connect()
* Write by Kerl W
******************************/
#include 做液
#include
#define TIME_OUT_TIME 20 //connect超時(shí)時(shí)間20秒
int main(int argc , char **argv)
{
………………
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd 0)
{
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
if(error == 0) ret = true;
else ret = false;
} else ret = false;
}
else ret = true;
ul = 0;
ioctl(sockfd, FIONBIO, &ul); //設(shè)置為阻塞模式
if(!ret)
{
close( sockfd );
fprintf(stderr , “Cannot Connect the server!n”);
return;
}
fprintf( stderr , “Connected!n”);
//下面還可以進(jìn)行發(fā)包收包操作
……………
}
以上代碼片段,僅供參考,也是為初學(xué)者提供一些提示,主要用到的幾個(gè)函數(shù),select, ioctl, getsockopt都可以找到相關(guān)資料,具體用法我這里就不贅述了,你只需要在linux中輕輕的敲一個(gè)man 就能夠看到它的用法。
此外我需要說(shuō)明的幾點(diǎn)是,雖然我們用ioctl把套接口設(shè)置為非阻塞模式,不過(guò)select本身是阻塞的,阻塞的時(shí)間就是其超時(shí)的時(shí)間由調(diào)用select 的時(shí)候的最后一個(gè)參數(shù)timeval類(lèi)型的變量指針指向的timeval結(jié)構(gòu)變量來(lái)決定的,timeval結(jié)構(gòu)由一個(gè)表示秒數(shù)的和一個(gè)表示微秒數(shù)(long類(lèi)型)的成員組成,一般我們?cè)O(shè)置了秒數(shù)就行了,把微妙數(shù)設(shè)為0(注:1秒等于100萬(wàn)微秒)。而select函數(shù)另一個(gè)值得一提的參數(shù)就是上面我們用到的fd_set類(lèi)型的變量指針。調(diào)用之前,這個(gè)變量里面存了要用select來(lái)檢查的描述符,調(diào)用之后,針對(duì)上面的程序這里面是可寫(xiě)的描述符,我們可以用宏FD_ISSET來(lái)檢查某個(gè)描述符是否在其中。由于我這里只有一個(gè)套接口描述符,我就沒(méi)有使用FD_ISSET宏來(lái)檢查調(diào)用select之后這個(gè)sockfd是否在set里面,其實(shí)是需要加上這個(gè)判斷的。不過(guò)我用了getsockopt來(lái)檢查,這樣才可以判斷出這個(gè)套接口是否是真的連接上了,因?yàn)槲覀冎皇亲兿嗟挠胹elect來(lái)檢查它是否連接上了,實(shí)際上select檢查的是它是否可寫(xiě),而對(duì)于可寫(xiě),是針對(duì)以下三種條件任一條件滿(mǎn)足時(shí)都表示可寫(xiě)的:
1)套接口發(fā)送緩沖區(qū)中的可用控件字節(jié)數(shù)大于等于套接口發(fā)送緩沖區(qū)低潮限度的當(dāng)前值,且或者i)套接口已連接,或者ii)套接口不要求連接(UDP方式的)
2)連接的寫(xiě)這一半關(guān)閉。
3)有一個(gè)套接口錯(cuò)誤待處理。
這樣,我們就需要用getsockopt函數(shù)來(lái)獲取套接口目前的一些信息來(lái)判斷是否真的是連接上了,沒(méi)有連接上的時(shí)候還能給出發(fā)生了什么錯(cuò)誤,當(dāng)然我程序中并沒(méi)有標(biāo)出那么多狀態(tài),只是簡(jiǎn)單的表示可連接/不可連接。
下面我來(lái)談?wù)剬?duì)這個(gè)程序測(cè)試的結(jié)果。我針對(duì)3種情形做了測(cè)試:
1. 目標(biāo)機(jī)器網(wǎng)絡(luò)正常的情況
可以連接到目標(biāo)主機(jī),并能成功以阻塞方式進(jìn)行發(fā)包收包作業(yè)。
2. 目標(biāo)機(jī)器網(wǎng)絡(luò)斷開(kāi)的情況
在等待設(shè)置的超時(shí)時(shí)間(上面的程序中為20秒)后,顯示目標(biāo)主機(jī)不能連接。
3. 程序運(yùn)行前斷開(kāi)目標(biāo)機(jī)器網(wǎng)絡(luò),超時(shí)時(shí)間內(nèi),恢復(fù)目標(biāo)機(jī)器的網(wǎng)絡(luò)
在恢復(fù)目標(biāo)主機(jī)網(wǎng)絡(luò)連接之前,程序一只等待,恢復(fù)目標(biāo)主機(jī)后,程序顯示連接目標(biāo)主機(jī)成功,并能成功以阻塞方式進(jìn)行發(fā)包收包作業(yè)。
linux系統(tǒng)超時(shí)設(shè)置的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux系統(tǒng)超時(shí)設(shè)置,「Linux系統(tǒng)如何設(shè)置超時(shí)時(shí)間」,linux socket 連接超時(shí) 怎么解決的信息別忘了在本站進(jìn)行查找喔。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站標(biāo)題:「Linux系統(tǒng)如何設(shè)置超時(shí)時(shí)間」(linux系統(tǒng)超時(shí)設(shè)置)
URL網(wǎng)址:http://www.5511xx.com/article/dpeoejj.html


咨詢(xún)
建站咨詢(xún)
