когда запускается linux, его первый процесс (PID 1) запускается ядром. Далее этот процесс разветвляется, запуская кучу чего, и вот, в некий момент, он вызывает, в очередной раз, fork (для примера, новый процесс PID 100, процесс предок PPID 1), и запускает getty, которая создаёт необходимый буфер для консоли, обеспечивает вывод информации на экран, а также файл устройства, например, tty3. Далее, getty, также делает fork, запуская программу login (PID 101 PPID 100), та, соответственно, запрашивает имя пользователя, пароль, и, полагаю, есть тоже какой-то системный вызов, которые эти данные передаёт ядру для сверки, после чего, ядро как-бы регистрирует права конкретного пользователя на доступ к ресурсам ПК к конкретному процессу.
Мало того, все последующие вызовы fork из этого залогиненного процесса будут наследоваться потомками. Затем запускается оболочка bash (PID 102 PPID 101), и мы пишем команды от лица зарегистрированного пользователя.
По-моему getty, работает немного не так. Он запрашивает логин, потом exec()-ом запускает /bin/login, который в свою очередь запрашивает пароль и, при его соответствии, exec()-ом запускает shell. Но перед этим он вызовами типа setuid() и setgid(), а может и ещё какими устанавливает себе соответствующие идентификаторы пользователя и группы.
Вопрос, во-первых, какими правами обладают процессы, которые запускает init до залогинивания? root?
Из той технологии, которая описана выше, видно, что они обладают правами пользователя root.
Во-вторых, когда в bash набираю exit он возвращается на уровень login, то есть как-бы разлогинивается. По идее должен иметься системный вызов, на отмену регистрации, тогда к каким правам вернулась программа login?
После завершения процесса, init видит, что завершился процесс getty (который потом переопределялся exec()-ами, но для init-а, он является всё тем-же процессом, всё с тем-же 100-ым условным идентификатором) и init запускает новый процесс getty.
В-третьих, в tty1 я запускаю процесс aaa &.
Консоль пишет: ...PID 140...
То есть, запустился новый процесс. Если затем разлогиниться, получается этот процесс так и сохранится с правами того пользователя из под которого был запущен?
Да, права относятся к процессу, соответственно их он не потеряет - даже после завершения родительского shell-а и даже сессии он будет иметь те права, которые он получил при запуске.
Хорошо, например, я включаю свою программу в init скрипт, она внутри, неважно как, пытается сделать, например, chmod file 777, который принадлежит root и имеет право доступа 700. Всё это произойдёт до залогинивания, отсюда:
если она будет иметь права root -> будут изменены параметры доступа к файлу,
если она не будет иметь прав root этого не будет. Так что же будет?
То есть, получается, PPID процесса изменится на 0, если его истинный предок завершится.
Если Ваша программа будет включена в сценарий инициализации - будет иметь права root-а, с которым запускается init, разве что Вы специально попробуете запустить её через sudo.
То есть, получается, PPID процесса изменится на 0, если его истинный предок завершится.
Предком процесса будет назначен процесс, с PID-ом равным 1, который, кроме всего прочего, занимается убиранием процессов-зомби - процессов, которые завершились, а статуса их завершения так ни кто и не затребовал, по причине, например, ошибки в родительском процессе или преждевременной смерти родителя. Вот за тем, что-бы они смогли наконец-то упокоиться с миром и следит init.