The OpenNET Project / Index page

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




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

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

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

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

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

    Вполне.


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

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

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

        man halt
        man execv


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

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

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

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

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

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

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

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

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

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

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

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

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

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

            • Программное завершение работы., !*! dennisfen, 18:51 , 06-Окт-09 (10)
              >>На данный момент у меня так и реализованно, только через /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, 03:57 , 08-Окт-09 (17)
                >Насчет системного вызова я скорее всего действительно сказал глупость. Однако про системные
                >вызовы, которые могут выключить систему упоминалось в книге 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"), как вам уже сказали.

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

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

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

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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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