2017-04-20 116 views
0

我正在開發一個C++庫,其中有一段shell script代碼返回特定串行端口的名稱。當我在控制檯或X64桌面或Arm環境中運行此腳本時,該腳本將返回正確的答案。我在庫內執行相同的腳本時出現問題,返回顯示不良形式的字符串,如ÈÛT¶ÈÛT¶¨a,但預期爲/dev/ttyACM0庫編譯爲體系結構x64,具有ARM架構錯誤

該庫的內部運行腳本:

腳本

bash -c 'for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev);do(syspath="${sysdevpath%/dev}";devname="$(udevadm info -q name -p $syspath)";[[ "$devname" == "bus/"* ]]&& continue;teste="$(udevadm info -q property --export -p $syspath | grep -i "company_name")";if [[ ! -z "${teste// }" && $devname == *"ttyACM"* ]]; then echo "/dev/$devname";fi);done;' 2> /dev/null 

下面這段代碼是用來保存腳本返回到一個文件中的內容。

代碼C++

pfFile = fopen(CONFIG_FILE, "w+"); 
fwrite(result,strlen(result), 1, pfFile); 
fclose(pfFile); 
return 0; 

回答

0

你如何執行從C++庫中的bash腳本?我沒有相同的USB設置爲自己讓你的bash腳本返回任何內容,我在我的系統,但作爲一個例子,下面的代碼工作正常,我的ls命令:

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 

int main (int argc, char * argv[]) 
{ 
    const size_t BUFLEN = 1000; 
    char buf[BUFLEN] = {0}; 
    unsigned int i = 0; 
    FILE *p = popen("bash -c 'ls -l' 2>/dev/null", "r"); 
    if (p != NULL) 
    { 
     while(!feof(p) && (i < BUFLEN -1)) 
     { 
      fread(&buf[i++],1,1,p); 
     } 
     pclose(p); 
    } 

    FILE *pfFile = fopen("output.txt", "w+"); 
    fwrite(buf, strlen(buf), 1, pfFile); 
    fclose(pfFile); 

    return 0; 
} 
0

除了你沒」包括你的C++代碼的結果和來自哪裏;你選擇了最難的方式來做到這一點。在庫中運行shell腳本的代碼很可能只會導致頭痛。

基本上,您可以爲您的設備創建一個udev規則,以在/ dev中創建一個唯一且穩定的文件來訪問它。你可以在ArchWiki中創建一個類似this one的文件

KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", SUBSYSTEMS=="usb", ATTRS{idVendor}=="05a9", ATTRS{idProduct}=="4519", SYMLINK+="video-cam1" 
+0

我不能在'udev'中制定規則,因爲這個庫是用於我們的客戶。 – JulianOliveira

+0

所以,還有另一種方法。將腳本另存爲可執行輸出旁邊的文件。使用'/ proc/self'你可以訪問可執行文件的路徑並在那裏執行shell腳本。出於調試目的,您可以在ssh或串行控制檯上檢查shell腳本的輸出。即使你可以輸出到一個文件 – Ongun