linux 에서 데 몬 데 몬 의 실현 (nginx 코드 를 예 로 들 면)
9756 단어 Daemon
ngx_int_t
ngx_daemon(ngx_log_t *log)
{
int fd;
// init :
// fork , 。 , , init ,
// , 。
switch (fork()) {
case -1:
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "fork() failed");
return NGX_ERROR;
case 0:
break;
default:
exit(0);
}
ngx_pid = ngx_getpid();
// setsid() , , 。
// , 。
// , ,
// fork() (nginx )。 ( ) , ,
// 。 INIT_DAEMON , ,
// 。
if (setsid() == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "setsid() failed");
return NGX_ERROR;
}
//
// , 。 , 。
// , umask , , 。
umask(0);
// :
// , , 。
// , 。
// dup 、 /dev/null
//(/dev/null , )。
fd = open("/dev/null", O_RDWR);
if (fd == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"open(\"/dev/null\") failed");
return NGX_ERROR;
}
if (dup2(fd, STDIN_FILENO) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDIN) failed");
return NGX_ERROR;
}
if (dup2(fd, STDOUT_FILENO) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDOUT) failed");
return NGX_ERROR;
}
#if 0
if (dup2(fd, STDERR_FILENO) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "dup2(STDERR) failed");
return NGX_ERROR;
}
#endif
if (fd > STDERR_FILENO) {
if (close(fd) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "close() failed");
return NGX_ERROR;
}
}
// (nginx )
// fork 。
// , 。
// , (/ )。
return NGX_OK;
}
setsid 지식:
setsid 함 수 를 호출 하여 새로 만 든 프로 세 스 를 제어 터미널 에서 벗 어 나 게 하고 새로운 프로 세 스 그룹 을 만 들 며 이 프로 세 스 그룹의 첫 번 째 프로 세 스 가 됩 니 다.독자 들 이 이 절 차 를 잘 이해 하도록 프로 세 스 팀, 세 션 (session) 의 기본 개념 을 소개 한다.
리 눅 스 시스템 에서 모든 프로 세 스 는 각자 의 프로 세 스 그룹 에 속한다.프로 세 스 그룹 은 하나 이상 의 프로 세 스 의 집합 입 니 다.예 를 들 어 어떤 반 은 프로 세 스 팀 이 고 그 중의 구성원 은 프로 세 스 라 고 볼 수 있다.한 반 에 적어도 한 명의 구성원 이 있다.한 반 의 마지막 구성원 이 존재 하지 않 을 때 이 반 도 존재 하지 않 는 다. 즉, 프로 세 스 팀 이 사라 진 것 이다.
모든 프로 세 스 그룹 은 프로 세 스 번호 와 유사 한 표 지 를 가지 고 있 으 며 프로 세 스 그룹 ID 라 고 합 니 다.프로 세 스 그룹 ID 는 선두 프로 세 스 의 프로 세 스 번호 에 의 해 결정 되 며, 모든 프로 세 스 그룹 에는 선두 프로 세 스 가 존재 합 니 다.프로 세 스 그룹의 존재 여 부 는 선두 프로 세 스 가 존재 하 는 지 여부 와 관계 가 없습니다.
세 션 은 하나 이상 의 프로 세 스 그룹의 집합 입 니 다.프로 세 스 그룹 과 유사 합 니 다. 세 션 마다 선두 프로 세 스 가 존재 합 니 다.리 눅 스 는 여러 사용자 의 운영 체제 로 같은 시간 에 서로 다른 사용자 에 속 하 는 여러 프로 세 스 가 존재 합 니 다.만약 에 사용자 가 특정한 터미널 에서 특정한 신 호 를 보 냈 다 면 예 를 들 어 'Ctrl + C' 를 누 르 고 SIGINT 신 호 를 보 내 면 어떻게 신호 가 해당 하 는 프로 세 스 로 정확하게 전송 되 는 지 확인 하 는 동시에 다른 터미널 을 사용 하 는 사용자 의 프로 세 스 에 영향 을 주지 않 습 니까?
세 션 과 프로 세 스 그룹 은 리 눅 스 커 널 이 여러 사용자 의 경우 사용자 프로 세 스 를 관리 하 는 방법 입 니 다.모든 프로 세 스 는 하나의 프로 세 스 그룹 에 속 하고, 프로 세 스 그룹 은 또 하나의 세 션 에 속한다.사용자 가 터미널 로그 인 시스템 (터미널 이 든 가짜 터미널 이 든) 에서 시스템 은 새로운 세 션 을 만 들 것 입 니 다.이 터미널 에서 시작 하 는 프로 세 스 는 세 션 의 프로 세 스 그룹 으로 시스템 에 의 해 분 리 됩 니 다.
세 션 의 프로 세 스 는 이 세 션 의 선두 프로 세 스 를 통 해 터미널 과 연 결 됩 니 다.이 단말 기 는 세 션 의 제어 단말기 입 니 다.하나의 세 션 은 하나의 제어 단말기 만 있 을 수 있 고, 반대로 같다.세 션 에 제어 터미널 이 존재 한다 면 프론트 프로 세 스 그룹 이 있 을 것 입 니 다.이 그룹 에 속 하 는 프로 세 스 는 제어 단말기 에서 입력 을 받 을 수 있 습 니 다.이 때 다른 프로 세 스 그룹 은 백 엔 드 프로 세 스 그룹 입 니 다.그림 8.3 은 세 션, 프로 세 스 그룹, 프로 세 스 와 제어 단말기 간 의 관 계 를 보 여 준다.
데 몬 이 터미널 을 제어 하지 않 았 기 때문에 fork 함수 로 만 든 하위 프로 세 스 는 부모 프로 세 스 의 제어 터미널, 세 션, 프로 세 스 그룹 을 계승 합 니 다. 따라서 부모 프로 세 스 의 영향 에서 벗 어 나 기 위해 새로운 세 션 을 만들어 야 합 니 다.Linux 시스템 은 새 세 션 을 만 드 는 데 setsid 함 수 를 제공 합 니 다.
setsid 함 수 는 새 세 션 을 만 들 고 setsid 함 수 를 호출 하 는 프로 세 스 를 새 세 션 의 선두 프로 세 스 로 만 듭 니 다.setsid 함 수 를 호출 하 는 프로 세 스 는 세 션 을 새로 만 드 는 유일한 프로 세 스 그룹 입 니 다. 프로 세 스 그룹 ID 는 프로 세 스 를 호출 하 는 프로 세 스 번호 입 니 다.setsid 함수 가 이 결 과 를 만 드 는 데 는 프로 세 스 가 프로 세 스 의 선두 프로 세 스 가 아 닌 조건 이 있 습 니 다.첫 번 째 단계 에서 fork 를 호출 하 는 부모 프로 세 스 가 종료 되 었 기 때문에 하위 프로 세 스 가 프로 세 스 그룹의 선두 프로 세 스 가 될 수 없습니다.이 세 션 의 선두 프로 세 스 는 터미널 과 연결 되 는 것 을 제어 하지 않 았 다.이로써 데 몬 이 터미널 을 제어 하지 않 았 다 는 요 구 를 만족 시 켰 습 니 다.
참고: http://www.cnblogs.com/xuxm2007/archive/2011/07/29/2121280.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
링크 ux 의 daemon 프로 세 스#include int daemon(int nochdir,int noclose) #include <unistd.h> int main(int argc, char *argv[]) if (daemon(0, 0)) {// ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.