• 守护进程


    所有守护进程都以超级用户(用户 ID为0)的优先权运行
    没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组ID设置为-1
    所有这些守护进程的父进程都是init进程(进程D为1)  /* 以下示例仅作参考不做正确保证*/
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<fcntl.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<sys/wait.h>
    #define MAXFILE 65535
    int main() {
    	pid_t pc;
    	int i, fd, len;
    	char *buf = "This is a Dameon\n";
    	len = strlen(buf);
    	pc = fork();
    	if(pc < 0) {
    		printf("error fork\n");
    		exit(1);
    	}
    	else if(pc > 0)
    		exit(0);  // 关闭父进程,我们需要的进程不可以是一个进程组的首进程,这是 setsid 的条件
    	setsid();
        /* 调用 setsid 以创建一个新的会话,并担任该会话组的组长。调用 setsid 作用有三个: 成为新对话期的首进程,成为一个新进程组的首进程,脱离控制终端。
           (会话组是一个或多个进程组的集合) */
    	chdir("/");
    	umask(0); //重设文件权限掩码
    	for(i = 0; i < MAXFILE; i++)
    		close(i);
    	while(1) {
    		if((fd = open("/tmp/dameon.log", O_CREAT|O_WRONLY|O_APPEND, 0600)) < 0) {
    			perror("open"); /*void perror(const char *s); perror ("open_port");用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串*/
    			exit(1);
    		}
    		write(fd, buf, len+1);
    		close(fd);
    		sleep(10);
    	}
    	exit(0);
    }
    

  • 相关阅读:
    13.线性回归
    12.scikit-learn中的Scaler
    11.数据归一化
    oracle之二表的几种类型
    oracle之二表和表空间的关系
    oracle之二数据字典表和动态性能视图
    oracle之二检查点
    oracle之二管理undo
    oracle之二归档日志
    oracle之二日志挖掘log miner
  • 原文地址:https://www.cnblogs.com/robbychan/p/3786959.html
Copyright © 2020-2023  润新知