我在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.
我不知道我哪里出错了。有人可以帮我解决这个问题。
答案 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 Programming,intro(2),intro(3),syscalls(2)以及您正在使用的每个功能的文档。