的/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