[linux] C语言Linux系统编程-做成守护进程
2023-02-18 15:46:59 时间
守护进程:
必须是init进程的子进程,运行在后台,不与任何控制终端相关联。
通过以下步骤成为守护进程
1.调用fork()创建出来一个新的进程,这个新进程会是将来的守护进程
2.在新守护进程的父进程中,调用exit(),为了守护进程的爷爷进程确认父进程结束
3.在新守护进程中,调用setsid(),使得该进程有一个新的进程组和新的会话,保证了该进程不与控制终端相关联
4.用chdir()将当前工作目录改为根目录,因为前面fork出来的新进程,当前工作目录可能在文件系统的任何地方
5.关闭所有文件描述符
6.打开 0 1 2号文件描述符(标准输入,标准输出,标准错误),把它们重定向到/dev/null
#include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <linux/fs.h> int main(){ int ret; //创建新进程 ret=fork(); //创建失败的直接返回 if(ret<0){ return -1; } //父进程直接结束 if(ret>0){ exit(EXIT_SUCCESS); } //创建新的进程组和会话 ret=setsid(); //失败的直接返回 if(ret<0){ return -1; } //改变当前工作目录 chdir("/"); //关闭所有文件描述符 //标准输入输出重定向到/dev/null //NR_FILE 是系统在某一给定时刻,限制的文件总数 for(int i=0;i<NR_FILE;i++){ close(i); } open("/dev/null",O_RDWR); dup(0); dup(0); //下面可以写自己的操作... while(1){ sleep(1); } return 0; }
自带函数:daemon();
原型 int daemon(int nochdir,int noclose)
nochdir为0 改为根目录,noclose为0 关闭所有文件描述符
daemon(0,0)
#include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <linux/fs.h> int main(){ daemon(0,0); //下面可以写自己的操作... while(1){ sleep(1); } return 0; }
相关文章
- [Golang系列] GOFLY在线客服-代码块和作用域-GO语言实现开源独立部署客服系统
- [Golang系列] GOFLY在线客服-使用golang中的全局变量-GO语言实现开源独立部署客服系统
- [前端]GOFLY在线客服-使用vh、vw使div元素充满屏幕-GO语言实现开源独立部署客服系统
- [前端] GOFLY在线客服-使用css overflow-y属性实现超出高度出滚动条-GO语言实现开源独立部署客服系统
- GOFLY在线客服-使用reconnect-websocket.js实现断线自动重连机制-GO语言实现开源独立部署客服系统
- [nginx] 解决nginx反代websocket 1006 (abnormal closure)错误-GOFLY在线客服-GO语言实现开源独立部署客服系统
- [前端] 浏览器展示调试console.debug输出信息-GOFLY在线客服-GO语言实现开源独立部署客服系统
- [前端] vue3中修改模板变量分隔符--GOFLY在线客服-GO语言实现开源独立部署客服系统
- [前端] vue中初始化函数created mounted区别--GOFLY在线客服-GO语言实现开源独立部署客服系统
- [前端]实现仿微信聊天对话框边框样式-GOFLY在线客服-GO语言实现开源独立部署客服系统
- [Go] gorm执行原生sql语句
- [Go] 申请成功软件著作权了😎✌!-GOFLY在线客服系统
- [Go] 解决packets.go:36: read tcp 127.0.0.1:51139->127.0.0.1:3306: wsarecv: An established connection was aborted by the software in your host ma chine.
- [Go] go run 时 os.Getwd 和 os.Executable 获取程序根路径
- [Go]go.mod 文件中的// indirect意思代表间接依赖
- [Go] 解决 imported from implicitly required module
- [Go] go语言中的结构体标签
- [Go] go语言使用dgrijalva/jwt-go 实现加解密jwt
- [Go] go语言gin框架验证post传递json数据
- [Go] go语言gin框架封装返回的错误码类