URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8463
[ Назад ]

Исходное сообщение
"Программное завершение работы."

Отправлено dennisfen , 05-Окт-09 11:53 
Господа,
Есть следующая проблема: необходимо завершить работу Linux и выключить компьютер (аналог консольной команды "shutdown -P now") из программы на C++. Я слышал, что есть системный вызов, решающий эту задачу, но, к сожалению, не могу найти какой. Кто-нибудь может помочь? Ну, и на всякий случай - это вообще реально сделать? Есть ли какие-нибудь подводные камни?

Заранее спасибо!


Содержание

Сообщения в этом обсуждении
"Программное завершение работы."
Отправлено svn , 05-Окт-09 12:22 
>Я слышал, что есть системный вызов, решающий эту задачу,

Тебя обманули. Нет такого вызова. Если у тебя есть права root то ты можешь переключить уровень работы на 0, и linux выключится. Если нет таких прав, то придётся просить чтобы это сделали DE/DM. Они могут не уметь или отказаться.

>Ну, и на всякий случай -
>это вообще реально сделать?

Вполне.



"Программное завершение работы."
Отправлено dennisfen , 05-Окт-09 12:24 
>>Я слышал, что есть системный вызов, решающий эту задачу,
>
>Тебя обманули. Нет такого вызова. Если у тебя есть права root то
>ты можешь переключить уровень работы на 0, и linux выключится. Если
>нет таких прав, то придётся просить чтобы это сделали DE/DM. Они
>могут не уметь или отказаться.

init 0?
Каким образом это сделать из программы?


"Программное завершение работы."
Отправлено Anonim , 05-Окт-09 19:31 
char *argv[] = { (char *)"/sbin/halt", 0 };
execv("/sbin/halt", argv);

man halt
man execv



"Программное завершение работы."
Отправлено dennisfen , 06-Окт-09 12:01 
>char *argv[] = { (char *)"/sbin/halt", 0 };
>execv("/sbin/halt", argv);
>
>man halt
>man execv

На данный момент у меня так и реализованно, только через /sbin/shutdown. Однако хотелось бы через системный вызов.


"Программное завершение работы."
Отправлено gaa , 06-Окт-09 12:18 
>На данный момент у меня так и реализованно, только через /sbin/shutdown. Однако
>хотелось бы через системный вызов.

А посмотреть исходник /sbin/shutdown и сделать как там религия не позволяет?


"Программное завершение работы."
Отправлено Slavaz , 06-Окт-09 12:25 
>>На данный момент у меня так и реализованно, только через /sbin/shutdown. Однако
>>хотелось бы через системный вызов.
>А посмотреть исходник /sbin/shutdown и сделать как там религия не позволяет?

Можно и так, но зачем писать тот код, который уже есть? В Никсах как бы не стыдно сделать execve() или system() :)


"Программное завершение работы."
Отправлено gaa , 06-Окт-09 20:36 
>>А посмотреть исходник /sbin/shutdown и сделать как там религия не позволяет?
>
>Можно и так, но зачем писать тот код, который уже есть? В
>Никсах как бы не стыдно сделать execve() или system() :)

Ну уж если гражданин упорствует, пусть пользуется тем, что можно посмотреть в исходник :)


"Программное завершение работы."
Отправлено dennisfen , 06-Окт-09 13:21 
>>На данный момент у меня так и реализованно, только через /sbin/shutdown. Однако
>>хотелось бы через системный вызов.
>
>А посмотреть исходник /sbin/shutdown и сделать как там религия не позволяет?

Я посмотрел. В моей системе тот же /sbin/shutdown реализован через upstart. Сейчас у меня нет времени разбираться с его структурой. Мне хотелось сделать это попроще, без лишнего "заморачивания". Судя по всему, самый простым способом в этом случае остается вызов /sbin/shutdown системы из моей программы.


"Программное завершение работы."
Отправлено gaa , 06-Окт-09 20:37 
>Судя по всему, самый простым способом
>в этом случае остается вызов /sbin/shutdown системы из моей программы.

Это является самым простым способом в 90% случаев, когда не вполне квалифицированному программисту хочется взять "системный вызов".


"Программное завершение работы."
Отправлено svn , 06-Окт-09 17:58 
>На данный момент у меня так и реализованно, только через /sbin/shutdown. Однако
>хотелось бы через системный вызов.

Системный вызов? Вы знаете о чём говорите?
Это надо остановить все программы, отключить диски, ещё кучу вещей сделать. Собственно для этого и сделаны стартовые скрипты, для этого и существует init, это его работа. А вовсе не ядра. Все системные вызовы (обращения к ядру) это простые и относительно короткие операции. Никакого вызова для выключение нет и быть не может. Этим занимается специальная программа - init.


"Программное завершение работы."
Отправлено dennisfen , 06-Окт-09 18:51 
>>На данный момент у меня так и реализованно, только через /sbin/shutdown. Однако
>>хотелось бы через системный вызов.
>
>Системный вызов? Вы знаете о чём говорите?
>Это надо остановить все программы, отключить диски, ещё кучу вещей сделать. Собственно
>для этого и сделаны стартовые скрипты, для этого и существует init,
>это его работа. А вовсе не ядра. Все системные вызовы (обращения
>к ядру) это простые и относительно короткие операции. Никакого вызова для
>выключение нет и быть не может. Этим занимается специальная программа -
>init.

Насчет системного вызова я скорее всего действительно сказал глупость. Однако про системные вызовы, которые могут выключить систему упоминалось в книге Advanced Linux Programming в главе "Chapter 8 Linux System Calls":
"Some system calls are very powerful and can exert great influence on the system. For instance, some system calls enable you _to_shut_down_ the Linux system or to allocate system resources and prevent other users from accessing them.These calls have the restriction that only processes running with superuser privilege (programs run by the root account) can invoke them.These calls fail if invoked by a nonsuperuser process."


"Программное завершение работы."
Отправлено jd , 08-Окт-09 03:57 
>Насчет системного вызова я скорее всего действительно сказал глупость. Однако про системные
>вызовы, которые могут выключить систему упоминалось в книге Advanced Linux Programming
>в главе "Chapter 8 Linux System Calls":
>"Some system calls are very powerful and can exert great influence on
>the system. For instance, some system calls enable you _to_shut_down_ the
>Linux system or to allocate system resources and prevent other users
>from accessing them.These calls have the restriction that only processes running
>with superuser privilege (programs run by the root account) can invoke
>them.These calls fail if invoked by a nonsuperuser process."

В Linux есть системный вызов reboot (о котором, видимо, и идёт речь), но он делает не совсем то, что вам нужно. То, что нужно (и к тому же портабельно) делает вызов system("shutdown"), как вам уже сказали.


"Программное завершение работы."
Отправлено аноним , 06-Окт-09 20:00 
Скажу про FreeBSD, для Linux должно быть примерно также, но лень смотреть исходники линуксового init.

Перезагрузка как делает shutdown:
kill(1, SIGUSR2).

1 = pid init'а, USR2 = poweroff (TERM=singleuser, INT=reboot, USR1=halt).

Есть еще системный вызов reboot - это именно мгновенная смерть, безо всяких попыток остановить процессы и т.д.


"Программное завершение работы."
Отправлено gaa , 06-Окт-09 20:38 
>Скажу про FreeBSD, для Linux должно быть примерно также, но лень смотреть
>исходники линуксового init.
>
>Перезагрузка как делает shutdown:
>kill(1, SIGUSR2).

Пробовал когда-то, работало.


"Программное завершение работы."
Отправлено аноним , 07-Окт-09 18:05 
>Пробовал когда-то, работало.

Сочуствую.


"Программное завершение работы."
Отправлено pavlinux , 08-Окт-09 03:40 
>Господа,
>Есть следующая проблема: необходимо завершить работу Linux и выключить компьютер

void halt(void)
{
  asm volatile("hlt": : :"memory");
}


"Программное завершение работы."
Отправлено svn , 08-Окт-09 12:13 
>>Господа,
>>Есть следующая проблема: необходимо завершить работу Linux и выключить компьютер
>
>void halt(void)
>{
>  asm volatile("hlt": : :"memory");
>}

"Программное завершение работы."
Отправлено Andrey Mitrofanov , 08-Окт-09 12:18 
>>  asm volatile("hlt": : :"memory");
>>}

Торопыга! Надо было дописать от себя чего. Прежде, чем _запускать_. :))


"Программное завершение работы."
Отправлено аноним , 08-Окт-09 17:37 
>>Господа,
>>Есть следующая проблема: необходимо завершить работу Linux и выключить компьютер
>
>void halt(void)
>{
>  asm volatile("hlt": : :"memory");
>}

Щазз тебе, hlt из юзерспейса.


"Программное завершение работы."
Отправлено pavlinux , 08-Окт-09 23:08 
>>>Господа,
>>>Есть следующая проблема: необходимо завершить работу Linux и выключить компьютер
>>
>>void halt(void)
>>{
>>  asm volatile("hlt": : :"memory");
>>}
>
>Щазз тебе, hlt из юзерспейса.

Ага, а shutdown -t now, kill -SIGUSR2 1, init 0, и т.п. можно?! :)