Прежде всего: setsid () сделает ваш процесс лидером группы процессов, но он также сделает вас лидером нового сеанса. Если вы просто заинтересованы в получении собственной группы процессов, используйте setpgid (0,0).
Теперь, чтобы понять реальную причину, почему setsid () возвращает EPERM, если вы уже являетесь лидером группы процессов или лидером сеанса, вы должны понимать, что идентификаторы группы процессов и сеанса инициализируются из идентификатора процесса создавшего их процесса (и, следовательно, их, т. е. для лидера сеанса pid == sid и для лидера группы процессов pid == pgid). Также группы процессов не могут перемещаться между сеансами.
Это означает, что если вы являетесь лидером группы процессов, и создание нового сеанса будет разрешено, тогда sid и pgid будут установлены на ваш pid, оставляя другие процессы в вашей старой группе процессов в странном состоянии: их процесс Лидер группы неожиданно оказывается на другой сессии, чем они сами. И это не может быть допущено, следовательно, EPERM ядром.
Теперь, если вы выполняете fork (), когда уже не являетесь ни сессией, ни лидером группы процессов, и, следовательно, установка sid и pgid для pid безопасна, потому что в этой группе нет других процессов.
Итак, даааа, подумай об этом, все это имеет смысл.