在Linux中,您可以使用TIOCEXCL TTY ioctl来阻止设备的其他open()成功(它们将返回-1,其中errno == EBUSY,设备或资源繁忙).这仅适用于终端和串行设备,但不依赖于建议锁定.
例如:
#include
#include
#include
#include
#include
#include
#include
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;
}
希望这可以帮助.