Вспоминаем struct proc_info
- информацию о процессе.
Допустим, процесс хочет создать директорию или файл. Как выставить права доступа?
По дефолту, это rw-rw-rw-
. Если мы хотим другие права, нужно об этом mkdir
'у сказать.
Для этого в proc_info
есть umask
. Делается & ~umask
с правами, которые мы указали при создании файла (дефолтные для файла 666, для директории 777).
Например, если мы вызовем mkdir
с umask = 022
, мы получим 755 = rwxr-xr-x
NB: umask
наследуется при fork'e. Стандартная для bash'a - 022.
Знакомые всем ссылки-ярлыки
- Hard links
- Soft (symbolic) links
SOFT
В структуре inode
указано, что эта нода - символьная ссылка, так же там содержится path
.
Все обращения к этой inode
переадресуются на path
HARD
Два имени в разных папках содержат на одну и ту же inode
. Работает только в пределах одной FS.
Чтобы узнать, когда на самом деле удалять файл, inode
хранит количество hard ссылок на неё.
Так как все записи у нас одинаковые, мы не можем узнать, кто оригинал.
man ln
расскажет всё о том, как делать ссылки.
У нас в proc_info
есть всякие pid, ppid, fdtable, regs и т. д. Часть из них - числа и влезают в регистр.
Большие же структуры (типа fdtable) хранятся по указателям. Какие-то из них наследуются при fork
'e, но, например, не общая память.
Если же мы хотим расшарить больше, есть системный вызов clone
. Например, если мы передадим наследнику всё, кроме регистров, у нас получится не новый процесс, а новый тред.
pthreads - сокращение от POSIX Threads. Можно юзать из С.
При создании нового треда все страницы памяти из стека становятся copy on write (т.е., создается новый стек), если ты не зааллоцировал его сам.
IPC
- InterProcess communication
- pipe - 2 fd, в один валится, из другого вываливается. Если закрывают все fd на один из концов, в другой прилетает EOF(в читающий) или EPIPE (в пишущий).
- fifo - 1 fd, один процесс открывает на чтение, другой на запись.
man 3 mkfifo
- Сигналы, см. следующую лекцию