데 몬 - 단계

_exit () 함수 의 역할 은 프로 세 스 를 직접 정지 시 키 고 사용 하 는 메모리 공간 을 제거 하 는 것 입 니 다. 커 널 에 있 는 각종 데이터 구 조 를 제거 합 니 다.exit () 함 수 는 이 를 바탕 으로 포장 을 했 고 exit () 함수 가 호출 되 었 습 니 다. exit 시스템 에 앞서 파일 의 열 림 상 태 를 확인 하고 파일 버퍼 의 내용 을 파일 에 다시 써 야 합 니 다.
wait 함 수 는 부모 프로 세 스 를 호출 하 는 데 사 용 됩 니 다. wait 하위 프로 세 스 가 끝나 거나 이 프로 세 스 가 지정 한 신 호 를 받 을 때 까지 차단 합 니 다.부모 프로 세 스 가 하위 프로 세 스 가 없 거나 하위 프로 세 스 가 끝 났 을 때 wait 바로 돌아 올 겁 니 다.
waitpid 작용 wait 마찬가지 로 그러나 첫 번 째 종 료 된 하위 프로 세 스 를 기다 릴 필 요 는 없습니다. 그것 은 아직 몇 가지 옵션 이 있다. 차단 되 지 않 은 버 전 을 제공 할 수 있다 면 wait 기능, 작업 제어 도 지원 합 니 다.실제로 wait 함수 waitpid 함수 의 특례 Linux 내부 실현 wait 함수 waitpid 함수
#include
#include
pid_t wait(int *status)
status 하위 프로 세 스 가 종 료 될 때의 상태 입 니 다.
• status 비어 있 으 면 임의의 상태 로 끝 나 는 하위 프로 세 스 를 의미 합 니 다.
• status 비어 있 지 않 으 면 지정 한 상태 에서 끝 난 하위 프로 세 스 를 의미 합 니 다.
또한 하위 프로 세 스 의 종료 상 태 는 Linux 중 일부 특정한 매크로 로 측정 한다.
 
#include
#include
pid_t waitpid(pid_t pid, int *status, int options)
pid 매개 변수 옵션:
pid > 0: 프로 세 스 만 기다 리 기 ID ... 과 같다 pid 하위 프로 세 스 입 니 다. 다른 하위 프로 세 스 가 끝 났 든 종료 되 었 든 지정 한 하위 프로 세 스 가 끝나 지 않 았 다 면 waitpid 계속 기다 릴 거 예요.
pid = − 1: 모든 하위 프로 세 스 가 종료 되 기 를 기다 리 고 있 습 니 다. wait 작용 이 같다
pid = 0: 같은 그룹 내 모든 프로 세 스 가 종료 되 기 를 기다 리 고 있 습 니 다.
pid < - 1: 그 그룹 을 기다 리 기 ID ... 과 같다 pid 하위 프로 세 스
options 매개 변수 옵션:
하면, 만약, 만약... pid 지정 한 하위 프로 세 스 를 즉시 사용 할 수 없 으 면 waitpid 막 히 지 않 고, 이 때 반환 값 은 0
WUNTRACED: 지원 하 는 작업 제 어 를 실현 하면 pid 지정 한 하위 프로 세 스 상태 가 일시 정지 되 었 으 며, 상태 가 일시 정지 이후 보고 되 지 않 으 면 상태 로 돌아 갑 니 다.
0: 동일 wait, 부모 프로 세 스 차단, 하위 프로 세 스 종료 대기
 
데 몬 Daemon (많은 프로 세 스 이름 끝의 d 는 Daemon 을 대표 하 는 뜻) 프로 세 스 는 시스템 이 불 러 올 때 시작 되 고 시스템 이 닫 힐 때 종 료 됩 니 다.
모든 프로 세 스 그룹 에는 팀장 프로 세 스 가 있 습 니 다. 팀장 프로 세 스 의 프로 세 스 번 호 는 프로 세 스 그룹 과 같 습 니 다. ID。프로 세 스 ID 팀장 님 프로 세 스 종료 로 영향 을 받 지 않 습 니 다.
한 세 션 은 사용자 로그 인 (즉, 셸 을 열 고) 을 시작 하여 사용자 가 종료 할 때 종료 합 니 다. 이 기간 동안 사용자 가 실행 하 는 모든 프로 세 스 는 이 세 션 기간 에 속 합 니 다.
만 든 프로 세 스 가 특정 콘 솔 에 의존 하기 때문에 콘 솔 이 종료 되면 프로 세 스 가 종 료 됩 니 다. 이 경 계 를 돌파 하기 위해 서 는 이 프로 세 스 를 데 몬 으로 바 꿔 야 합 니 다.
데 몬 을 만 드 는 일반적인 절차:
1. 하위 프로 세 스 만 들 기, 부모 프로 세 스 종료
pid=fork();
  if(pid>0){
  exit(0);
}
자식 프로 세 스 가 고아 프로 세 스 로 바 뀌 면 1 번 프로 세 스 (즉 init 프로 세 스) 가 입양 합 니 다.
부모 프로 세 스 가 종료 되면 셸 에서 이 프로그램 이 종료 되 었 다 는 가상 을 만 들 고 셸 은 다른 명령 을 계속 수행 합 니 다.
2. 하위 프로 세 스 에서 새 세 션 만 들 기
setsid 함 수 는 새 세 션 을 만 들 고 이 세 션 그룹의 팀장 을 맡 는 데 사 용 됩 니 다.호출 setsid 밑 에 있어 요. 3 개 역할:
프로 세 스 를 원래 세 션 의 제어 에서 벗 어 나 게 합 니 다.
프로 세 스 를 원래 프로 세 스 그룹의 제어 에서 벗 어 나 게 합 니 다.
프로 세 스 를 원 제어 단말기 의 제어 에서 벗 어 나 게 합 니 다.
호출 중 fork 함수 시, 하위 프로 세 스 는 부모 프로 세 스 의 세 션 진행 기간, 프로 세 스 그룹, 제어 터미널 등 을 모두 복사 하 였 습 니 다. 부모 프로 세 스 가 종료 되 었 지만 원래 의 세 션 기간, 프로 세 스 그룹, 제어 터미널 등 은 변 하지 않 았 습 니 다. 따라서 setsid 가 아 닌 진정한 의미 에서 독립 된 것 이 아 닙 니 다. 함 수 는 프로 세 스 를 완전히 독립 시 켜 모든 다른 프로 세 스 의 제어 에서 벗 어 날 수 있 습 니 다.
#include
#include
pid_t setsid(void)
성공: 이 프로 세 스 그룹 ID
오류
이 단 계 를 마 친 후 데 몬 은 소속 제어 단말기 와 연락 이 끊 겼 습 니 다. stdin, stdout, stderr 는 더 이상 작 동 하지 않 습 니 다.
3. 현재 디 렉 터 리 를 루트 디 렉 터 리 로 변경
쓰다 fork 만 든 하위 프로 세 스 는 부모 프로 세 스 의 현재 작업 디 렉 터 리 를 계승 합 니 다.프로 세 스 가 실행 되 는 과정 에서 현재 디 렉 터 리 가 있 는 파일 시스템 (예 를 들 어 '/ mnt / usb' 등) 은 마 운 트 해제 할 수 없 기 때문에 앞으로 의 사용 에 많은 번 거 로 움 을 초래 할 수 있 습 니 다 (예 를 들 어 시스템 이 특정한 이유 로 단일 사용자 모드 에 들 어가 야 합 니 다) 。따라서 일반적인 방법 은 '/' 를 데 몬 의 현재 작업 디 렉 터 리 로 하 는 것 입 니 다. 그러면 상기 문 제 를 피 할 수 있 습 니 다. 물론 특별한 수요 가 있 으 면... 현재 작업 디 렉 터 리 를 / tmp 와 같은 다른 경로 로 바 꿀 수도 있 습 니 다.작업 디 렉 터 리 를 바 꾸 는 흔 한 함 수 는? chdir。
4. 파일 마스크 재 설정
사용 하기 때문에 fork 함수 가 새로 만 든 하위 프로 세 스 는 부모 프로 세 스 의 파일 권한 마스크 를 계승 하여 이 하위 프로 세 스 가 파일 을 사용 하 는 데 많은 번 거 로 움 을 가 져 왔 습 니 다.따라서 파일 권한 마스크 를 0. 이 데 몬 의 유연성 을 크게 향상 시 킬 수 있 습 니 다.파일 권한 마스크 를 설정 하 는 함 수 는? umask。여기 서 일반적인 사용 방법 은? umask(0)。
5. 파일 설명자 닫 기
쓰다 fork 함수 가 새로 만 든 하위 프로 세 스 는 부모 프로 세 스에 서 열 린 파일 을 계승 합 니 다.이 열 린 파일 들 은 데 몬 이 읽 거나 쓰 지 않 을 수도 있 지만, 시스템 자원 을 소모 할 수도 있 고, 파일 시스템 이 지 워 지지 않 을 수도 있 습 니 다.
#include<stdio.h>
#include<sys/wait.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>

#define MAXFILE 65535

int main()
{
    pid_t pid;
    char *buff = "This is dameon process!
"; int len, i; int fd; pid = fork(); // if (pid < 0) { perror("fork"); exit(-1); } else if (pid > 0) exit(0); // setsid(); // chdir("/tmp"); // umask(0); // for (i = 0; i <= MAXFILE; i++) // close(i); /* */ len = strlen(buff); while (1) { if ((fd =open("dameon.log", O_CREAT | O_WRONLY | O_APPEND,0600)) < 0) { perror("open"); exit(1); } write(fd, buff, len + 1); close(fd); sleep(1); } return 0; }

  
6. 데 몬 (Daemon)
데 몬 (Daemon) 은 터미널 에서 제어 되 지 않 는 프로 세 스 를 배경 으로 실행 합 니 다.예 를 들 어 각종 네트워크 서버, 웹 서버, ftp 서버 등.
모든 터미널 에서 벗 어 나 려 는 이 유 는 데 몬 이 터미널 에서 시 작 될 수 있 기 때 문 입 니 다. 그 후에 이 터미널 은 다른 작업 을 수행 하거나 터미널 을 닫 아 도 시 작 된 데 몬 에 영향 을 주지 않 습 니 다. 간단 한 방법 은 시작 할 때 명령 행 끝 에 & 기 호 를 추가 하 는 것 입 니 다. 예 를 들 어 nohup my server. out &,하지만 코드 를 써 서 프로그램 을 데 몬 으로 바 꿀 수도 있 습 니 다.
데 몬 으로 변경 하면 다음 과 같은 몇 단계 로 진행 할 수 있 습 니 다.
1. 부모 프로 세 스에 서 포크 를 다시 실행 하고 부모 프로 세 스 를 물 러 나 게 하여 프로그램 과 터미널 의 연결 을 끊 습 니 다.
2. 하위 프로 세 스에 서 setsid () 를 호출 합 니 다.새 프로 세 스 를 새 프로 세 스 팀장 과 새 세 션 기간 의 리더 로 만 들 기;
3. 루트 디 렉 터 리 를 프로 세 스 의 작업 디 렉 터 리 로 만 듭 니 다. 데 몬 이 연결 가능 한 파일 시스템 에서 시작 되면 작업 디 렉 터 리 를 수정 하지 않 으 면 데 몬 이 실 행 될 때 이 파일 시스템 을 마 운 트 해제 할 수 없습니다.
4. umask 를 0 으로 수정 하여 데 몬 에서 만 든 파일 이 원래 부모 프로 세 스 의 umask 속성 에 영향 을 받 지 않도록 합 니 다.
5. 필요 하지 않 은 파일 설명 자 를 가능 한 한 닫 습 니 다.
   
예시:
   
  #include 
  #include 
  #include 
  #include 
   
  void BeDaemon()
  {
   const int MAXFD=64;
if (fork ()! = 0) / / 제어 단말기 이탈
   exit(0);
setsid (); / / 새 프로 세 스 팀장 과 새 세 션 리더 가 됩 니 다.
chdir ("/"); / 작업 디 렉 터 리 를 루트 디 렉 터 리 로 설정 합 니 다.
umask (0); / / 파일 접근 권한 마스크 재 설정
for (int i = 0; i < maxfd; i + +) 부모 프로 세 스에 서 물 려 받 은 모든 파일 을 가능 한 한 닫 습 니 다.
   close(i);
  }
   
  int main()
  {
   int iLoop=0;
BeDaemon (); / / 데 몬 이 됨
   while(true){
   sleep(1);
   }
   return 0;
   }

좋은 웹페이지 즐겨찾기