美文网首页
守护进程

守护进程

作者: arkliu | 来源:发表于2022-11-27 09:33 被阅读0次
获取进程组id
获取pid进程的进程组id  如果pid = 0,那么该函数作用和getpgrp一样
pid_t getpgid(pid_t pid);
获取当前进程的进程组id
pid_t getpgrp(void);

获取进程组id

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>

// 获取进程组id
int main() {
    pid_t pid;
    if ((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    } else if (pid == 0)
    {
        printf("child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(getpid()));
        printf("child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
        printf("child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(0));
    }
    
    printf("parent pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
    return 1;
}

设置子进程的进程组id为子进程自己, 父进程的进程组id为父进程的父进程

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>

// 设置子进程的进程组id为子进程自己, 父进程的进程组id为父进程的父进程
int main() {
    pid_t pid;
    if ((pid = fork()) < 0)
    {
        perror("fork");
        exit(1);
    } else if (pid == 0)
    {
        printf("before child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(0));
        sleep(5);
        printf("after child pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgid(0));
    } else {
        sleep(1);
        setpgid(pid, pid);

        sleep(2);
        printf("before parent pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
        setpgid(getpid(),getppid());
        printf("after bparent pid = %d, ppid = %d, pgid=%d\n", getpid(), getppid(), getpgrp());
        while(1);
    }
    return 1;
}

创建会话
创建一个会话需要注意以下6点注意事项:

  1. 调用进程不能是进程组组长,该进程变成新会话首进程(session header)
  2. 该进程成为一个新进程组的组长进程。
  3. 需有root权限(ubuntu不需要)
  4. 新会话丢弃原有的控制终端,该会话没有控制终端
  5. 该调用进程是组长进程,则出错返回
  6. 建立新会话时,先调用fork, 父进程终止,子进程调用setsid
使用ps -ajx
USER               PID  PPID  PGID   SESS JOBC STAT   TT       TIME COMMAND

arkleoliu        81103  5661 81103      0    4 S+   s002    0:00.00 cat
arkleoliu        81104  5661 81103      0    4 S+   s002    0:00.00 cat
arkleoliu        81105  5661 81103      0    4 S+   s002    0:00.00 cat
arkleoliu        81106  5661 81103      0    4 S+   s002    0:00.00 cat

守护进程

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/stat.h>

void main() {
    pid_t pid = fork();
    if (pid > 0 || pid == -1)
    {
        return;
    }
    setsid();
    chdir(".");
    umask(0);
    close(STDIN_FILENO);
    open("/dev/null", O_RDWR);
    dup2(0, STDOUT_FILENO);
    dup2(0, STDERR_FILENO);
}

相关文章

  • rsync服务企业应用

    守护进程服务企业应用: 守护进程多模块功能配置 守护进程的排除功能实践 守护进程来创建备份目录 守护进程的访问控制...

  • Python多进程

    守护进程 守护进程其实就是“子进程“是否伴随主进程一起结束:守护==>伴随,即守护进程会伴随主进程的代码运行完毕后...

  • 守护进程和守护线程详解

    守护进程 什么是守护进程? 守护进程会在主进程代码运行结束的情况下,立即挂掉。 守护进程本身就是一个子进程。 主进...

  • 4.5、守护进程及信号处理实战

    1、守护进程功能的实现守护进程融入项目,解放终端。相关配置:Daemon = 1;按照守护进程的方式运行守护进程如...

  • PHP创建守护进程

    PHP 创建守护进程 执行守护进程

  • forever

    start:启动守护进程stop:停止守护进程stopall:停止所有的forever进程restart:重启守护...

  • 进程守护进程

    什么是守护进程?Linux 的大多数服务器就是用守护进程实现的,使用ps -axj可以查看守护进程: 守护进程基本...

  • redis.conf详解之daemonize

    用法 作为非守护进程运行 作为守护进程运行 注意事项: 默认情况下,Redis不作为守护进程运行。如果以守护进程运...

  • 守护进程,互斥锁,队列,生产者消费者模型

    守护进程 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进...

  • 开源HIDS-Wauzh功能测试

    一、Wazuh 守护进程及工具进程 守护进程 ossec-agentd https://documentation...

网友评论

      本文标题:守护进程

      本文链接:https://www.haomeiwen.com/subject/vnbmxdtx.html