The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Программное завершение работы."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


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

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

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

Вполне.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

man halt
man execv


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Программное завершение работы."  +/
Сообщение от dennisfen email(ok) on 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."

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

17. "Программное завершение работы."  +/
Сообщение от jd (??) on 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"), как вам уже сказали.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

Сочуствую.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2021 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру