Linux下串列埠通訊詳解(下)讀寫串列埠及關閉串列埠

HAN_UESTC發表於2016-02-22

上一篇部落格是串列埠的開啟及配置,部落格連結http://blog.csdn.net/specialshoot/article/details/50707965

這一篇我將要把讀寫串列埠及串列埠關閉的操作詳細介紹一下。

讀串列埠

讀串列埠就是接收串列埠資料,通過read來實現。

read函式原型:

#include <unistd.h>    
ssize_t read(int fd, void *buf, size_t count);  

引數說明:

  • fd:檔案描述符
  • *buf:緩衝區,讀取的資料會被放到這個緩衝區中去
  • count:請求讀取的位元組數,讀上來的資料儲存在緩衝區buf中,同時檔案的當前讀寫位置向後移。
如下兩句程式碼即可:

nread=read(fd,buff,8);//讀串列埠 
printf("nread=%d,%s\n",nread,buff); 
注意:
read預設為阻塞模式,若在open操作中設定O_NONBLOCK則是非阻塞模式。在阻塞模式中,read沒有讀到資料會阻塞住,直到收到資料;非阻塞模式read沒有讀到資料會返回-1不會阻塞。

如果是非阻塞模式,read要放在迴圈中保證持續讀資料:

while(1) {
非阻塞read(裝置1);
if(裝置1有資料到達)
  處理資料;
非阻塞read(裝置2);
if(裝置2有資料到達)
  處理資料;
...
sleep(n);
}
sleep(n)的目的是為了做個延遲防止一直在迴圈做無用功,在延遲等待的時候可以排程其它程式。

如果是阻塞模式,便可以直接呼叫read,不用放在while迴圈中。

阻塞模式有出現一個問題,見下面程式碼:

#include<unistd.h>
#include<stdlib.h>
int main(void){
    char buf[10];
    int n;
    n=read(STDIN_FILENO,buf,10);
    if(n<0){
        perror("read STDIN_FILENO");
        exit(1);
    }
    write(STDOUT_FILENO,buf,n);
    return 0;
}
編譯後執行如下圖所示:

執行結果

大家可以看到第一次輸入hello沒有問題,第二次輸入helloworldhelloworld後helloworld這10個字元列印出來,程式退出後,Shell繼續讀取使用者輸入的命令,於是讀走了終端裝置輸入緩衝區中剩下的字元和換行符當做一條命令去處理,執行不了顯示未找到命令。

寫串列埠

寫串列埠即傳送資料,用write函式,write函式原型如下:

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
引數含義同read相同,需要注意的也同read相同.設定阻塞非阻塞也會同樣的影響到write.

我上傳的程式碼有阻塞模式的,也有非阻塞模式的,大家看open中有無設定O_NONBLOCK即可判斷阻塞或是非阻塞模式。非阻塞模式read和write要放在while迴圈中

關閉串列埠

close函式,函式原型:

#include<unistd.h>  
int close(int fd);
關閉串列埠就這一個知識點,沒有其它的了。

程式碼資源連結:http://download.csdn.net/detail/specialshoot/9438578


相關文章