2014-08-27 56 views
0

我使用Ubuntu。我試圖用通配符來使用system()函數,並且每次運行該函數時,都需要*作爲文字。我在系統中使用的命令是echo。它看起來像這樣。如何獲得系統()使用通配符

system("echo cape-bone-iio > /sys/devices/bone_capmgr.*/slots) 

我試過對它和其他許多東西進行嘗試,但我無法使這個通配符工作。它返回一個錯誤:

Sh: 1: cannot create /sys/devices/bone_capemgr.*/slots 

它,當我通過終端,但沒有從程序上運行它的工作原理

我有一種變通方法,它只是通過數從0到99個週期,但它佔用了更多的資源比我想。我知道使用系統命令並不安全,但我嚴格使用beaglebone系統。

+1

你確定它可以在終端上工作嗎?看起來像是一個「模棱兩可的重定向」給我。 – 2014-08-27 21:37:17

+0

是的。沒有錯誤,當我檢查文件,它是所有的 – cmacia06 2014-08-27 21:38:17

+1

你去這個錯誤,你應該直接寫入'slots'文件 – vanjoe 2014-08-27 21:38:33

回答

3

/sys/devices/bone_capmgr.*/slots通配是由shell中運行你的echo之前擴大。閱讀glob(7)。如果匹配兩個文件(例如,具有*是要麼27)您的命令被擴展爲:

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(或globwordexp)做的,所以手工編寫這個循環避免分叉殼應稍快運行。

您也可以使用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沒有任何功能,你無法使用純系統調用。

+0

謝謝你的回覆!問題是我無法直接從程序寫入文件。只有一個具有該名稱的文件,但每次啓動都會更改數字。 – cmacia06 2014-08-27 21:52:54

+3

但你可以'readdir'包含該文件的目錄來找到該文件,因此編號... – 2014-08-27 21:53:43

+0

我想添加最好的解決方案是在C程序中使用glob。這使得它變得更容易。 – cmacia06 2014-10-08 19:48:51

-1

首先,我必須說,你應該直接寫入文件,而不是產生一個過程來爲你做。

說了這麼多,你可以做你通過 system("sh -c 'echo cape-bone-iio > /sys/devices/bone_capmgr.*/slots'")

+0

無用,因爲根據定義'system'是分叉'/ bin/sh -c'! – 2014-08-27 22:04:17

+0

真的嗎?這似乎愚蠢。難怪它從未被使用過。 – vanjoe 2014-08-27 22:32:40

1

問什麼。如果你堅持使用system呼叫,則另一個備選方案是find命令:

system("find /sys/devices/ -type d -name 'bone_capmgr.*'" 
     " -exec sh -c 'echo cap-bone-iio > {}/slots' \;" ); 

這則防止註釋中提到的模糊重定向錯誤應該有多個目錄匹配全局模式bone_capmgr.*

但是,我會建議採取由Basile Starynkevitch提供的建議。

相關問題