programing

setsid() 앞에 포크()가 있는 이유

batch 2023. 6. 10. 08:35
반응형

setsid() 앞에 포크()가 있는 이유

왜죠fork()전에setsid()프로세스를 데몬화하시겠습니까?

기본적으로 프로세스를 제어 터미널에서 분리하여 프로세스 그룹 리더로 만들고 싶다면 : 사용합니다.setsid().

이전에 포크를 사용하지 않고 이렇게 하는 것은 효과가 없습니다.

왜요?

먼저, setsid()는 프로세스를 프로세스 그룹 리더로 만들지만 사용자를 새 세션의 리더로 만들 수도 있습니다.고유한 공정 그룹을 얻는 데 관심이 있는 경우 setpgid(0.0)를 사용합니다.

이미 프로세스 그룹 리더 또는 세션 리더인 경우 setsid()가 EPERM을 반환하는 실제 이유를 이해하려면 프로세스 그룹 및 세션 ID가 프로세스 그룹 및 세션 ID를 생성하는 프로세스 ID에서 초기화된다는 것을 이해해야 합니다.세션 리더 pid == sid 및 프로세스 그룹 리더 pid == pgid)의 경우.또한 프로세스 그룹은 세션 간에 이동할 수 없습니다.

즉, 프로세스 그룹 리더로서 새 세션을 생성할 수 있다면 Sid와 Pgid가 사용자의 pid로 설정되어 이전 프로세스 그룹의 다른 프로세스가 이상한 상태가 됩니다. 프로세스 그룹 리더가 갑자기 다른 세션에 있을 수 있습니다.그리고 그것은 허용될 수 없으며, 따라서 커널에 의한 EPERM.

이제 당신이 세션이나 프로세스 그룹 리더가 아닌 이상 포크()를 사용한다면, 당신의 sid와 pgid를 당신의 pid로 설정하는 것은 안전합니다. 왜냐하면 그러한 그룹에는 다른 프로세스가 없기 때문입니다.

자, 옙, 생각해 보세요. 모든 것이 이치에 맞습니다.

해야 합니다.fork()그리고 아이에게 전화하라고 합니다.setsid()전화를 거는 과정을 확실히 하기 위해.setsid()이미 프로세스 그룹 리더가 아닙니다(setsid()호출 프로세스를 새 프로세스 그룹의 프로세스 그룹 리더로 만들려고 하므로, 이 경우 실패합니다.).

man 2 setsid다음과 같은 설명을 얻을 수 있습니다.

setsid()는 호출 프로세스가 프로세스 그룹 리더가 아닌 경우 새 세션을 만듭니다.호출 프로세스는 새 세션의 리더, 새 프로세스 그룹의 프로세스 그룹 리더이며 제어 터미널이 없습니다.호출 프로세스의 프로세스 그룹 ID 및 세션 ID는 호출 프로세스의 PID로 설정됩니다.호출 프로세스는 이 새 프로세스 그룹과 새 세션의 유일한 프로세스입니다.

setsid()새 세션과 새 프로세스 그룹(같은 프로세스 그룹 ID)을 생성하면 프로세스 그룹 ID 충돌이 발생합니다.

언급URL : https://stackoverflow.com/questions/2613104/why-fork-before-setsid

반응형