的/sys/devices/bone_capmgr.*/slots
通配是由shell中运行你的echo
之前扩大。阅读glob(7)。如果匹配两个文件(例如,具有*
是要么2
或7
)您的命令被扩展为:
echo cape-bone-iio > \
/sys/devices/bone_capmgr.2/slots /sys/devices/bone_capmgr.7/slots
,你看到那么它是无感。 (但它才有意义,如果*
扩大到一件事像4
)。如果没有文件匹配globbing模式,你的shell可能会在里面创建一个*
的文件名(这会触发cannot create /sys/devices/bone_capemgr.*/slots
消息)。
您可能会遇到也许
for f in /sys/devices/bone_capmgr.*/slots ; do \
echo cape-bone-iio > $f ; \
done
但我不认为经过这么长的字符串system
始终是一个好主意。你可以做的for
循环在你的C程序(例如使用opendir(3) + readdir(3)上/sys/devices/
...),那么你甚至不需要任何system
(使用readdir
只是一些fopen
+ fprintf
+在循环fclose
...)。您也可以使用glob(3)或wordexp(3)。
如果没有/sys/devices/bone_capmgr.*/slots
文件存在,例如,您可能需要处理这种情况。因为某些硬件缺失或未连接。
BTW,由system(3)调用的外壳将扫描的目录,如readdir
(或glob
或wordexp
)做的,所以手工编写这个循环避免分叉壳应稍快运行。
您也可以使用nftw(3),但我认为这对您的需求太笼统了。它会递归扫描文件树,如find(1)命令所做的那样。
你也可以使用snprintf
生成一个文件名,在for (ix=0; ix<100; x++)
循环使用access(2)
最后测试它的存在,你也许对这查询这些设备的存在直通/proc/
(见proc(5)更多,如果它揭露了一些关于你的硬件的东西)。 udev(7)也可能是相关的。
BTW尝试strace(1)外壳在终端(或简称strace /bin/sh -c "echo cape-bone-iio > /sys/devices/bone_capmgr.*/slots"
)解释你的echo
命令找出你的外壳使用的syscalls(2)。
shell没有任何功能,你无法使用纯系统调用。
你确定它可以在终端上工作吗?看起来像是一个“模棱两可的重定向”给我。 – 2014-08-27 21:37:17
是的。没有错误,当我检查文件,它是所有的 – cmacia06 2014-08-27 21:38:17
你去这个错误,你应该直接写入'slots'文件 – vanjoe 2014-08-27 21:38:33