从C程序执行终端命令,并不像我期望的那样

时间:2013-04-14 22:05:46

标签: c++ linux debian raspberry-pi

我正在尝试获取包含WiFi信号强度的变量。从终端

执行时,以下命令成功返回
iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1

返回74/100

但是,当我把它放入system()调用时,我得到以下编译错误。

int main (){
system("iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1");
return 0;
}

当我编译那个......

$ c ++ wifi.cc wifi.cc:在函数'int main()'中:

wifi.cc:8:59:错误:分配只读位置'“iwconfig $ _ [0] | grep信号| cut -d”'

wifi.cc:8:59:错误:'const char [16]'赋值给'const char [34]'的不兼容类型

非常感谢任何想法/建议。

4 个答案:

答案 0 :(得分:5)

这是因为你的字符串文字中有未转义的引号。你需要逃脱它们:

system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");

在错误的代码中,引号正在配对如下:

system("iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1");
       ^                                   ^ ^            ^ ^    ^
       └─────────────────1─────────────────┘ └──────2─────┘ └─3──┘

如您所见,有三个单独的字符串文字。在转义引号之后,就C ++而言,只有一对引号:

system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");
       ^                                                             ^
       └──────────────────────────────1──────────────────────────────┘

转义引号(前面有\的引号)只是字符串的一部分。

但是,在终端中,命令不是某些字符串的一部分。它本身只是一个命令,引用如下配对:

iwconfig wlan0 |grep Signal| cut -d"=" -f3 |cut -d" " -f1
                                   ^ ^            ^ ^
                                   └1┘            └2┘

答案 1 :(得分:1)

你需要像"那样逃避\"

system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");

否则你在第一种情况下所拥有的是:

"iwconfig wlan0 |grep Signal| cut -d" = " -f3 |cut -d"
                                     ^^^

尝试分配给字符串文字,这是错误assignment of read-only location的来源。

答案 2 :(得分:1)

如果你的字符串很简单并且你想避免逃避 - 地狱,你也可以在shell命令中使用单引号,例如:

system("iwconfig wlan0 |grep Signal| cut -d'=' -f3 |cut -d' ' -f1");

这只能起作用,因为在shell中你可以使用双引号和单引号作为字符串文字( 两者之间有差异,但现在让我们不要理会它们。)

除了我建议使用库调用而不是执行终端程序。这应该使您的程序更快(因为您不必调用外部程序调用库来获取某些值并打印出来;仅用于解析打印输出并尝试读取正确的值),并且更加健壮(例如,如果iwconfig的输出因新版本而改变,或仅仅因为它是在不同的语言下运行;或者您有多个无线连接,或者......)

查看libiw

答案 3 :(得分:0)

您需要使用转义序列在字符串内添加引号,如下所示:

system("iwconfig wlan0 |grep Signal| cut -d\"=\" -f3 |cut -d\" \" -f1");
//                                         ^^ ^^            ^^ ^^