在串列埠設定中,有以下兩個引數可以決定是否阻塞。
在開啟串列埠時不加o_nodelay,可用下面的第二種方法,來進行阻塞/非阻塞的設定
c_cc[vtime]
非規範模式讀取時的超時時間(單位:百毫秒
),可以這麼理解,從接收到後乙個位元組開始計時,如果超時,則退出read
c_cc[vmin]
非規範模式讀取時的最小字元數,設為0則為非阻塞,如果設為其它值則阻塞,直到讀到到對應的資料
關鍵**
ifd = open(cserialname, o_rdwr | o_noctty);
opt.c_cc[vmin]
= 0;//data_len;
opt.c_cc[vtime] =
30;//每個單位是0.1秒 20就是2秒
通過上面的設定,如果在 len=read(fd, tmp,124);
無任何資料,則會3秒鐘後退出read,但是如果串列埠有讀取到資料則會立即返回
c_cc[
vmin
],就像乙個閥值一樣,比如設為8,如果只接收到3個資料,那麼它是不會返回的,只有湊齊8個資料後一齊才read返回,阻塞在那兒了.
opt.c_cc[vmin]
= 8;//data_len;
opt.c_cc[vtime] =
30;//每個單位是0.1秒 20就是2秒
如果這樣設定,就完全阻塞了,只有串列埠收到至少8個資料才會對read立即返回,或才少於8個資料時,超時3秒也會有返回
再來說下
read(fd, tmp,xx);如果其中的xx設為1,則只要串列埠有乙個資料,即使opt.c_cc[vmin]=8,它也會立即返回,無需湊足8bytes,如果這個數為1024,只要實際接收的資料超出opt.c_cc[vmin]設定的值後,也會立即返回,而不用湊足1024,我個人感覺這個值設為1比較好,用於阻塞方式的讀取,如果非阻塞,當然是0
o_nonblock和o_ndelay所產生的結果都是使i/o變成非擱置模式(non-blocking),在讀取不到資料或是寫入緩衝區已滿會馬上return,而不會擱置程式動作,直到有資料或寫入完成。
它們的差別在於設立o_ndelay會使i/o函式馬上回傳0,但是又衍生出乙個問題,因為讀取到檔案結尾時所回傳的也是0,這樣無法得知是哪中情況;因此,o_nonblock就產生出來,它在讀取不到資料時會回傳-1,並且設定errno為eagain。
不過需要注意的是,在gnu c中o_ndelay只是為了與bsd的程式相容,實際上是使用o_nonblock作為巨集定義,而且o_nonblock除了在ioctl中使用,還可以在open時設定。
Linux串列埠阻塞與非阻塞
linux串列埠程式設計的阻塞與否可以在open函式中設定,例如 開啟時使用 fd open usar1,o rdwr o noctty 阻塞式讀寫 fd open dev ttyat2 o rdwr o noctty o ndelay 非阻塞讀寫除了用open函式之外還可以在open函式之後用fc...
Linux阻塞與非阻塞
1.阻塞 block 概念 指程序或執行緒在執行裝置操作或管道,或則網路時,不能獲取到資源就被掛起,直到滿足可操作的條件後在進行操作,被掛起的程序進入休眠狀態,從執行佇列移走,直到 等待的條件滿足才繼續執行。也就是執行到某些函式時必須等待某個事件發生函式才返回。2.非阻塞 non block 程序就...
linux下串列埠的阻塞和非阻塞操作
有兩個可以進行控制串列埠阻塞性 同時控制read和write 乙個是在開啟串列埠的時候,open函式是否帶o ndelay 第二個是可以在開啟串列埠之後通過fcntl 函式進行控制。阻塞的定義 對於read,block指當串列埠輸入緩衝區沒有資料的時候,read函式將會阻塞在這裡,移植到串列埠輸入緩...