C++写入configfs/sysfs失败,bash命令可行,求非system()解决方案
USB Gadget调试问题:写入sysfs的UDC文件失败(Device or resource busy)
问题描述
调试手机USB Gadget,要实现手机向PC提供ISO镜像服务时遇到异常:用C++代码写入/sys/kernel/config/usb_gadget/g1/UDC时始终报Device or resource busy错误,但命令行用echo执行完全正常,求不使用system()的解决办法。
(小更新:已通过freopen成功写入sysfs路径)
代码片段
void sysfs_write(char *path, char *content) { std::cout << "Write: " << content << " -> " << path << std::endl; int fd = open(path, O_WRONLY); if (fd == -1) { perror("Failed"); return; } int n = write(fd, content, strlen(content)); if (n == -1) { perror("Failed"); } close(fd); } sysfs_write("/sys/kernel/config/usb_gadget/g1/UDC", ""); sysfs_write("/sys/kernel/config/usb_gadget/g1/UDC" , "a600000.dwc3"); // 两次调用都报Device or resource busy错误
Stat信息
/sys/kernel/config/usb_gadget/g1/UDC的stat输出:
File: /sys/kernel/config/usb_gadget/g1/UDC Size: 4096 Blocks: 0 IO Block: 4096 regular file Device: 0,17 Inode: 249229 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-02-01 01:17:16.229999999 +0200 Modify: 2023-02-01 01:28:46.424746782 +0200 Change: 2023-02-01 01:28:46.424746782 +0200 Birth: -
/sys/kernel/config/usb_gadget/g1的stat输出:
File: /sys/kernel/config/usb_gadget/g1 Size: 0 Blocks: 0 IO Block: 4096 directory Device: 0,17 Inode: 18684 Links: 4 Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-02-01 01:18:00.646458114 +0200 Modify: 2023-02-01 01:17:23.679999997 +0200 Change: 2023-02-01 01:17:23.679999997 +0200 Birth: -
解决办法
添加换行符到写入内容:命令行
echo默认会在输出末尾添加换行符,而你的代码里直接写字符串没有加。sysfs的很多节点要求写入的内容以换行结尾,否则会判定为无效操作,进而返回资源忙错误。修改代码,在写入的字符串末尾加上\n:sysfs_write("/sys/kernel/config/usb_gadget/g1/UDC", "\n"); sysfs_write("/sys/kernel/config/usb_gadget/g1/UDC" , "a600000.dwc3\n");确保写入完整内容:检查
write的返回值,确认是否写入了全部字节。改成循环写入,保证内容完全写入:void sysfs_write(char *path, char *content) { std::cout << "Write: " << content << " -> " << path << std::endl; int fd = open(path, O_WRONLY); if (fd == -1) { perror("Failed"); return; } size_t len = strlen(content); ssize_t written = 0; while (written < len) { ssize_t ret = write(fd, content + written, len - written); if (ret == -1) { perror("Failed"); break; } written += ret; } close(fd); }调整文件打开模式:尝试添加
O_TRUNC标志打开文件,确保文件被截断后再写入:int fd = open(path, O_WRONLY | O_TRUNC);
内容的提问来源于stack exchange,提问作者Alexandru Nitan
相关产品推荐
相关产品推荐

