距离上一次利用高并发技术实现360度行车记录仪功能已经过去半年了。开始写一系列关于系统编程和网络编程内容进行总结。
温故而知新,欢迎大家讨论学习。
2021-09-05 补充
1、dup2与dup区别是dup2可以用参数newfd指定新文件描述符的数值。若参数newfd已经被程序使用,则系统就会将newfd所指的文件关闭,若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等.
返回值:
若dup2调用成功则返回新的文件描述符,出错则返回-1.
2 主控线程不能用return 退出main空间,子线程可以。exit退出进程
1 守护进程
1.1 什么是守护进程
- 在linux系统中,我们会发现在系统启动的时候有很多的进程就已经开始跑了,也称为服务,这也是我们所说的守护进程。
- 守护进程(daemon)是生存期长的一种进程,没有控制终端。
- 它们常常在系统引导装入时启动,仅在系统关闭时才终止。
- UNIX系统有很多守护进程,守护进程程序的名称通常以字母“d”结尾:例如,syslogd 就是指管理系统日志的守护进程
- 通过ps进程查看器
ps -efj
的输出实例,内核守护进程的名字出现在方括号中,大致输出如下:
1.2 守护进程创建步骤
- fork子进程,让父进程终止。
- 子进程调用,setsid()创建会话。
- 通常根据需要,改变工作目录chdir
- 通常根据需要,重设umask文件权限掩码
- 通常根据需要,关闭/重定向文件描述符
- 守护进程,业务逻辑。while()
1.3 守护进程代码实现(重点)
主要是理解一些概念,重点参考一下文献。
参考文献(非常重要)
1 掩码+进程组+会话的描述
2 dev/null是什么
3标准输入 标准输出 标准错误
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int argc, char *argv[])
{
pid_t pid;
int ret, fd;
pid = fork();
if (pid > 0) // 父进程终止
exit(0);
pid = setsid(); //创建新会话
if (pid == -1)
sys_err("setsid error");
ret = chdir("/home/itcast/28_Linux"); // 改变工作目录位置
if (ret == -1)
sys_err("chdir error");
umask(0022); // 改变文件访问权限掩码
close(STDIN_FILENO); // 关闭文件描述符 0标准输入 //因为0 1 2 都是进程启动默认启动的
fd = open("/dev/null", O_RDWR); // fd --> 0
if (fd == -1)
sys_err("open error");
dup2(fd, STDOUT_FILENO); // 重定向 stdout和stderr
dup2(fd, STDERR_FILENO);
while (1);</