2014-11-04 6 views
-2

Я запускал следующую программу в качестве пользователя root в C++.системная команда, не работающая в C++

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

Получает ли возвращаемое значение вам что-нибудь? – doctorlove

+1

sudo обычно требует пароля. Вас спрашивают пароль при запуске? – zmbq

+1

Я не думаю, что 'sync' даже нужно запускать как root. – ams

ответ

2

Лучше избегать system(3) для таких вещей. Вы можете просто позвонить sync(2) (это один из немногих syscalls(2), который не может потерпеть неудачу). Вы можете позвонить по телефону fopen(3) (как FILE*f = fopen("/proc/sys/vm/drop_caches", "r"); ...) затем fprintf(3) & 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, компилировать все предупреждения & отладочной информации (gcc -Wall -Wextra -g) и использовать отладчик (gdb). И узнать, как использовать strace(1)

Читать Advanced Linux Programming, intro(2), intro(3)syscalls(2), и документацию каждой функции, которую вы используете.

+0

Большое спасибо за помощь .. но я получаю ошибку: не удалось преобразовать 'sync()' из 'void' в 'bool' –

+0

Моя ошибка. 'sync (2)' не может провалиться! Но, пожалуйста, поймите смысл RTFM, STFW и GIYF. –

+0

Большое спасибо. Но теперь он дает ошибку: fprintf drop_cache: Плохой дескриптор файла :( –

2

sudo sh -c sync, вероятно, не работает, потому что sudo необходимо прочитать пароль пользователя. Поскольку он запускается из вашей программы, а не терминала, он не запрашивает этот пароль. Попробуйте использовать -n (неинтерактивный) вариант для sudo и изменить /etc/sudoers/, так что команде, которую нужно запустить, не нужно запрашивать пароль. Лучше, не используйте sudo внутри вашей программы, вместо этого используйте sudo для запуска вашего приложения.

echo 3 > /proc/sys/vm/drop_caches не работает, потому что /proc/sys/vm/drop_caches обычно не доступен для записи пользователем. См. Мой совет в предыдущем абзаце.

Смежные вопросы