c_cpp 使用ioctl()和errno的正确方法。 #linux #c #errno #ioctl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 使用ioctl()和errno的正确方法。 #linux #c #errno #ioctl相关的知识,希望对你有一定的参考价值。

static unsigned char commit_ioctl()
{
	int block_dev = -1;
	int error_code = 0;
	int retval = 0;
	unsigned retry_count = 0;

	errno = 0; /* Clear errno - successfull function calls might leave old value. */
	block_dev = open(block_dev_name, O_RDWR);
	/* Need to save errno as it might be reset by library calls. */
	error_code = errno; 

	if (block_dev == -1) {
		LOGE("Failed to open %s with: %s.", block_dev_name, strerror(error_code));
	} else {
		for(retry_count=0;retry_count<IOCTL_RETRY_MAX;retry_count++) {
			retval = ioctl(block_dev, BLKCOMMAND);
			error_code = errno;
			if (retval !=  -1 || error_code != EAGAIN) {
				break;
			}
			usleep(IOCTL_DELAY);
		}
		if (retval == -1) {
			LOGE("Ioctl failed on %s with: %s (retry_count %d)",
					block_dev_name, strerror(error_code), retry_count);
		} else {
			/* In case we got an EAGAIN but then ioctl() worked,
			 * we need to reset return value. */
			error_code = 0;
			LOGI("Ioctl operation succeeded.");
		}
		close(block_dev);
	}
	return error_code;
}

以上是关于c_cpp 使用ioctl()和errno的正确方法。 #linux #c #errno #ioctl的主要内容,如果未能解决你的问题,请参考以下文章

调用 ioctl() 导致 errno 指示“错误地址”

Errno::ENOTTY 通过 SuSe 上的 Net::SSH 连接到远程服务器时设备的 ioctl 不合适(使用 Ruby on Rails 5.2.4)

c_cpp 通过IOCTL获取终端大小

如何在 Mac 插件中使用 ioctl() 设置 RTS?

如何在 Linux 设备驱动程序中设置 errno?

Python 处理 socket.error:[Errno 104] 连接由对等方重置