c - write() 到 sysfs 条目 /sys/bus/pci/devices/.../driver/remove_id 失败
问题描述
看到/sys/bus/pci/devices/.../driver/remove_id文件上的write()函数失败,返回 -1 且errno等于 19 ( ENODEV )。
但是,通过命令行也可以正常工作。我已经检查了用户对这个文件执行写操作似乎很好的文件权限(--w------)。
int fp = 0;
int buffer_length = 0;
int bytes_written = 0;
fp = open(cmd_buf, O_WRONLY); // where cmd_buf will hold this string
// "/sys/bus/pci/devices/.../driver/remove_id"
if (fp == -1)
{
return -1;
}
// where inbuf will be a char * pointing to pci vendor device id like
// this, "XXXX YYYY"
bytes_written = write(fp, in_buf, sizeof(in_buf));
printf(" bytes_written : %d \n ", bytes_written);
看到 bytes_written 等于 -1 并且errno显示 19。
如果您发现代码片段有问题,请告诉我?
解决方案
两个可能的问题:
- 在write()系统调用中使用sizeof(in_buf)会写入字符串“vendorId deviceId”,如果in_buf[]大于 10 个字符,则其后面可能会包含更多垃圾数据。
- 也许in_buf不是一个表,而是一个指针,因此sizeof(in_buf)将返回 4 或 8(分别为 32 位或 64 位系统的指针大小),但不是它指向的字符串的长度。
因此,在这两种情况下(in_buf定义为表或指针),strlen(in_buf)而不是sizeof(in_buf)是要写入的数据长度的最安全的解决方案,前提是字符串以 '\0' 终止.
推荐阅读
- python - 无法在代码中调用 Google Chrome 的位置
- python - How to echo hex from python
- xamarin - How to use a relative path in XDocument.Load with Xamarin?
- javascript - 打字稿如何声明一个返回它被调用的对象的方法(this)
- python - 如何将 pipenv 添加到我的 .zshrc 中的 PATH
- ios - 测验的故事板版本
- windows - How to open a file in lua
- c# - 无法使用 Angular 7、.net core 2.2 从 HttpClient POST 方法获取响应
- python - 为 ID 和 Json 对象列表构建缓存结构
- java - 如何解决“未报告的异常 AWTException ;必须被捕获或声明为抛出”。机器人实例