> 백엔드 개발 > PHP 튜토리얼 > C 및 PHP 환경에서 데몬 프로세스 구현의 예

C 및 PHP 환경에서 데몬 프로세스 구현의 예

*文
풀어 주다: 2023-03-18 11:12:01
원래의
1496명이 탐색했습니다.

데몬은 일반적으로 터미널을 제어하지 않는 백그라운드 작업으로 생각됩니다. 본 글에서는 C 환경과 PHP 환경에서 PHP 데몬 프로세스를 구현하는 방법과 원리 프로세스를 주로 소개한다. PHP의 데몬 프로세스를 이해하는 모든 분들에게 도움이 되기를 바랍니다.

데몬이란 무엇인가요?

데몬은 일반적으로 터미널을 제어하지 않는 백그라운드 작업으로 간주됩니다. 여기에는 세 가지 특징이 있습니다. 백그라운드에서 실행되고, 시작된 프로세스와 분리되며, 터미널을 제어할 필요가 없습니다. 일반적으로 사용되는 구현 방법은 fork() -> 이 함수를 호출하면 현재 프로세스가 터미널을 떠나 데몬 프로세스가 될 수 있습니다. 자세한 내용은 man 데몬을 참조하세요. 현재 PHP에는 이러한 기능이 없습니다. PHP 프로그램의 데몬화를 구현하는 방법에는 두 가지가 있습니다.

1. nohup

nohup php myprog.php > log.txt 시스템 명령을 사용하세요. 프로그램은 백그라운드에서 실행되지만 실제로는 사용자가 터미널을 종료하면 프로세스가 종료됩니다.

2.를 달성하려면 nohup을 사용해야 합니다. 감독자 도구 사용(이 솔루션 권장)

감독자 사용에 대한 자세한 튜토리얼

3. 물론, 프로그램으로 구현하는 것도 가능합니다(프로덕션 환경에서는 권장하지 않습니다) C 프로그램 구현:

#include#include#include#include#include#include//实现守护进程步骤
void crete_daemon(void)
{
pid_t pid = 0;
pid = fork();
if (pid<0)
{
perror("fork");
exit(-1);
}
if (pid > 0)
{
//1.父进程直接退出
exit(0);
}
//2.
//执行到这里就是子进程
//setsid 将当前进程设置为一个新的会话期session,目的就是
//让当前进程脱离控制台,成为守护进程。
pid = setsid();
if (pid < 0)
{
perror("setsid");
exit(-1);
}
//3.设置当前进程的工作目录为根目录,不依赖于其他
chdir("/");
//4.umask设置为0确保将来进程有最大的文件操作权限
umask(0);
//5.关闭文件描述符
//先要获取当前系统中所允许打开的最大文件描述符数目
int i = 0;
int cnt = sysconf(_SC_OPEN_MAX);
for (i=0;i
로그인 후 복사


테스트 결과:

데몬 프로세스:


The 여기서 중요한 두 가지가 더 있습니다. 첫 번째 PHP 함수는 pcntl_fork() 및 posix_setsid()

fork() 프로세스입니다. 즉, 실행 중인 프로세스의 복사본이 하위 프로세스로 간주되고 원본 프로세스가 생성됩니다. 부모 프로세스로 간주됩니다. fork()가 실행된 후에는 이를 시작한 프로세스 및 터미널 제어에서 분리될 수 있습니다. 이는 또한 상위 프로세스가 자유롭게 종료될 수 있음을 의미합니다. setid()는 먼저 새 프로세스를 새 세션의 "리더"로 만들고 마지막으로 프로세스가 더 이상 터미널을 제어하지 않도록 만듭니다. 이는 데몬 프로세스가 되는 데 있어 가장 중요한 단계이기도 합니다. 터미널이 닫히면 강제로 종료됩니다. 이는 중단할 수 없는 상주 프로세스에 대한 중요한 단계입니다. 마지막 fork()를 수행합니다. 이 단계는 필수는 아니지만 일반적으로 수행됩니다. 가장 큰 의미는 제어 터미널을 얻는 것을 방지하는 것입니다. (터미널 장치를 직접 열고 O_NOCTTY 플래그를 사용하지 않으면 제어 터미널을 얻습니다.)

기타 참고 사항:

chdir() 데몬 프로세스는 기본적으로 마운트 해제 시 상위 프로세스의 현재 작업 디렉터리를 상속합니다. 이는 많은 문제를 야기합니다. 일반적으로 "/"는 데몬 프로세스의 현재 작업 디렉터리로 사용되며, 이는 위의 문제를 피할 수 있습니다. umask() 데몬 프로세스는 상위 프로세스의 파일 권한 마스크를 상속합니다. 프로세스를 기본적으로 자식 프로세스로 파일밴드를 사용하는 것이 문제가 많았습니다. 따라서 파일 권한 마스크를 0으로 설정하면 데몬의 유연성이 크게 향상될 수 있습니다. fclose(STDIN), fclose(STDOUT), fclose(STDERR)는 표준 I/O 스트림을 닫습니다. 포크 기능을 사용하여 생성된 하위 프로세스는 상위 프로세스에서 열려 있는 일부 파일을 상속합니다. 이러한 열린 파일은 데몬에서 읽거나 쓸 수 없지만 여전히 시스템 리소스를 소비하고 파일 시스템이 마운트 해제될 수 있습니다.

관련 권장 사항 : PHP, 프로세스 관리, 프로세스 오류 자동 시작 기능, 서버 관리자에게 적합한 프로세스 오류 자동 시작 기능으로 작성된 프로세스 데몬은 Windows의 Windows

에 적합합니다. PHP는 프로세스를 데몬 메소드, PHP 프로세스 데몬 으로 사용합니다.

위 내용은 C 및 PHP 환경에서 데몬 프로세스 구현의 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿