系统命令无法在C ++中工作

时间:2014-11-04 12:32:58

标签: c++

我在c ++中以root用户身份运行以下程序。

 int main(){
   if (system("sudo sh -c sync")!=0)
       cout<<"\n sync failed";       
   if (system("echo 3 > /proc/sys/vm/drop_caches")!=0)
       cout<<"\n clearning cache failed";
}

但是,我发现缓存未被清除,我得到以下输出:

 sync failed.
 clearing cache failed.

我不知道我哪里出错了。有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

sudo sh -c sync可能会失败,因为sudo需要读取用户密码。由于它是从您的程序而不是终端运行的,因此无法提示输入该密码。尝试使用-n的{​​{1}}(非交互式)选项,并修改sudo,以便您需要运行的命令不需要提示输入密码。更好的是,不要在程序中使用sudo,而是运行使用/etc/sudoers/来运行你的应用程序。

sudo失败,因为echo 3 > /proc/sys/vm/drop_caches通常不会被用户写入。请参阅前一段中的建议。

答案 1 :(得分:2)

最好避免system(3)这样的事情。你可以打电话给sync(2)(它是为数不多的syscalls(2)之一,它不会失败)。您可以拨打fopen(3)FILE*f = fopen("/proc/sys/vm/drop_caches", "r"); ...),然后fprintf(3)&amp;第二种情况fclose;你总是要对失败进行测试,并在失败的情况下使用perror

所以,

sync();
FILE *f = fopen("/proc/sys/vm/drop_caches", "r");
if (!f) { perror("fopen drop_caches"); exit(EXIT_FAILURE); };
if (fprintf(f, "3\n") < 0) 
   { perror ("fprintf drop_cache"); exit(EXIT_FAILURE); };
if (fclose(f)) { perror ("fclose drop_cache"); exit(EXIT_FAILURE); };
顺便说一句,不要忘记所需的#include - s,编译所有警告&amp;调试信息(gcc -Wall -Wextra -g)和使用调试器gdb)。并了解如何使用strace(1)

阅读Advanced Linux Programmingintro(2)intro(3)syscalls(2)以及您正在使用的每个功能的文档。