我有一个问题,我正试图解决在Linux中的串行端口。 我可以打开,阅读和closures端口。 但是,我想确保在任何时候我是唯一一个从港口读写的人。
我认为这已经为我做了open()函数调用后。 不过,我可以在程序的同一个端口上多次调用open()。 我也可以有两个线程同时从同一个端口读取。
我试着用flock()修复这个问题,我仍然有同样的问题。 是否因为两个系统调用来自同一个pid,即使每一组打开和读取都有不同的文件描述符? 为了logging,两个open()调用都返回一个有效的文件描述符。
因此,我想知道是否有什么办法可以解决问题。 从我的程序的angular度来看,如果两个调用open()在同一个端口上是成功的,那么程序员应该知道它们引起的闹剧是没有什么大不了的。 不过,我只想确保当我打开一个端口时,我是唯一访问它的进程。
谢谢您的帮助。
在Linux中,您可以使用TIOCEXCL
TTY ioctl来阻止其他open()
到设备(他们将返回-1
与errno==EBUSY
,设备或资源繁忙)。 这仅适用于终端和串行设备,但不依赖于咨询锁定。
例如:
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <termios.h> #include <fcntl.h> #include <errno.h> int open_device(const char *const device) { int descriptor, result; if (!device || !*device) { errno = EINVAL; return -1; } do { descriptor = open(device, O_RDWR | O_NOCTTY); } while (descriptor == -1 && errno == EINTR); if (descriptor == -1) return -1; if (ioctl(descriptor, TIOCEXCL)) { const int saved_errno = errno; do { result = close(descriptor); } while (result == -1 && errno == EINTR); errno = saved_errno; return -1; } return descriptor; }
希望这可以帮助。
我能够解决使用flock()函数的问题。 由于某种原因,使用结构和fcntl()并不适合我。 使用flock()我能够添加两行代码并解决我的问题。