2017-07-26 409 views
0

我必須確保Linux上的tty設備只能從一個實例一次訪問。 爲此,我已經實現了一個flock()函數。 但是,在我的測試中,我無法同時打開另一個進程的串口,即使沒有邏輯邏輯也是如此。從多個進程同時打開tty可能嗎?

我現在想知道這是否是所有情況下的正常行爲,所以我可以刪除我的flock()邏輯並依靠阻止open()邏輯?是否有可能同時打開不同實例的串口?

編輯:

我已經想通了,這的確是可能的TTY端口多次同時打開,而不flock()邏輯。 但是,open()函數似乎因爲flock()而被阻塞。

回答

1

通常,可以同時從多個進程打開串行設備。

可以使用TIOCEXCLioctl()獲得獨佔訪問:

if (!ioctl(fd, TIOCEXCL)) { 
    /* Any further open() on the tty 
     that is currently open on descriptor fd 
     will fail with errno == EBUSY 
     (except for the administrator, with the 
     CAP_SYS_ADMIN capability) */ 
} 

,並重新允許其他open() S,

ioctl(fd, TIOCNXCL); 

你需要包括<sys/ioctl.h>的功能,常數爲<termios.h>

許多Linux串行庫已經這樣做。某些串行驅動程序可能一次只允許打開一個驅動程序,因此爲了確定您所看到的行爲的原因,我需要更多詳細信息(如何打開串行設備以及使用的串行設備驅動程序,特定)。

個人 - 我相信這是大多數Linux的串行庫不 - ,我建議你嘗試ioctl(fd, TIOCEXCL),並也許警告用戶,如果它失敗(返回0,如果成功,-1除此以外);並且在所有情況下都使用ioctl(fd, TIOCNXCL); close(fd);關閉tty。

相關問題