2017-04-20 120 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