不备案的网站可以做竞价吗,怎样制作悬浮的WordPress,完成网站开发需要什么样技术,seo网站建设技巧一 何为守护进程 守护进程#xff08; Daemon #xff09;也称为精灵进程#xff0c;是运行在后台的一种特殊进程#xff0c;它独立于控制终端并且周期性 地执行某种任务或等待处理某些事情的发生#xff0c;主要表现为以下两个特点#xff1a; 长期运行。守护进程是一…一 何为守护进程 守护进程 Daemon 也称为精灵进程是运行在后台的一种特殊进程它独立于控制终端并且周期性 地执行某种任务或等待处理某些事情的发生主要表现为以下两个特点 长期运行。守护进程是一种生存期很长的一种进程它们一般在系统启动时开始运行除非强行终 止否则直到系统关机都会保持运行。与守护进程相比普通进程都是在用户登录或运行程序时创 建在运行结束或用户注销时终止但守护进程不受用户登录注销的影响它们将会一直运行着、 直到系统关机。 与控制终端脱离。在 Linux 中系统与用户交互的界面称为终端每一个从终端开始运行的进程都 会依附于这个终端这是上一小节给大家介绍的控制终端也就是会话的控制终端。当控制终端被 关闭的时候该会话就会退出由控制终端运行的所有进程都会被终止这使得普通进程都是和运 行该进程的终端相绑定的但守护进程能突破这种限制它脱离终端并且在后台运行脱离终端的 目的是为了避免进程在运行的过程中的信息在终端显示并且进程也不会被任何终端所产生的信息 所打断。 守护进程是一种很有用的进程。Linux 中大多数服务器就是用守护进程实现的譬如Internet 服务器 inetd、Web 服务器 httpd 等。同时守护进程完成许多系统任务譬如作业规划进程 crond 等。 守护进程 Daemon通常简称为 d一般进程名后面带有 d 就表示它是一个守护进程。守护进程与终端 无任何关联用户的登录与注销与守护进程无关、不受其影响守护进程自成进程组、自成会话即 pidgidsid。通过命令ps -ajx查看系统所有的进程如下所示 TTY 一栏是问号表示该进程没有控制终端也就是守护进程其中 COMMAND 一栏使用中括号 [] 括 起来的表示内核线程这些线程是在内核里创建没有用户空间代码因此没有程序文件名和命令行通常 采用 k 开头的名字表示 Kernel 。 二 编写守护进程程序 如何将自己编写的程序运行之后变成一个守护进程呢本小节就来学习如何编写守护进程程序编写 守护进程一般包含如下几个步骤 1) 创建子进程、终止父进程 父进程调用 fork() 创建子进程然后父进程使用 exit() 退出这样做实现了下面几点。第一如果该守护 进程是作为一条简单地 shell 命令启动那么父进程终止会让 shell 认为这条命令已经执行完毕。第二虽然 子进程继承了父进程的进程组ID 但它有自己独立的进程 ID 这保证了子进程不是一个进程组的组长进程 这是下面将要调用 setsid 函数的先决条件 2) 子进程调用 setsid 创建会话 这步是关键在子进程中调用上一小节给大家介绍的 setsid() 函数创建新的会话由于之前子进程并不 是进程组的组长进程所以调用 setsid() 会使得子进程创建一个新的会话子进程成为新会话的首领进程 同样也创建了新的进程组、子进程成为组长进程此时创建的会话将没有控制端。 所以这里调用 setsid 有 三个作用让子进程摆脱原会话的控制、让子进程摆脱原进程组的控制和让子进程摆脱原控制终端的控制。 在调用 fork 函数时子进程继承了父进程的会话、进程组、控制终端等虽然父进程退出了但原先 的会话期、进程组、控制终端等并没有改变因此那还不是真正意义上使两者独立开来。setsid 函数能够 使子进程完全独立出来从而脱离所有其他进程的控制。 3) 将工作目录更改为根目录 子进程是继承了父进程的当前工作目录由于在进程运行中当前目录所在的文件系统是不能卸载的 这对以后使用会造成很多的麻烦。因此通常的做法是让“/ ”作为守护进程的当前目录当然也可以指定其 它目录来作为守护进程的工作目录。 4) 重设文件权限掩码 umask 文件权限掩码 umask 用于对新建文件的权限位进行屏蔽在 5.5.5 小节中有介绍。由于使用 fork 函数新 建的子进程继承了父进程的文件权限掩码这就给子进程使用文件带来了诸多的麻烦。因此 把文件权限掩 码设置为 0确保子进程有最大操作权限、这样可以大大增强该守护进程的灵活性。设置文件权限掩码的函 数是 umask 通常的使用方法为 umask(0) 。 umask(user file-creatiopn mode mask)是linux中的一个命令用于为用户文件创建权限掩码语法“umask [-S][权限掩码]”其中“权限掩码”是由3个八进制的数字所组成将现有的存取权限减掉权限掩码后即可产生建立文件时预设的权限。 /umask命令可确定要在创建的任何文件或者目录上设置的默认权限。umask命令为用户文件创建掩码是创建文件或文件夹时默认权限的基础。通常我们可以使用chmod修改linux中文件的权限.umask的作用与chmod的效果相反具体看下面。 若没有文件掩码时文件的默认权限为0666,文件夹的默认权限为0777。 5) 关闭不再需要的文件描述符 子进程继承了父进程的所有文件描述符这些被打开的文件可能永远不会被守护进程此时守护进程指 的就是子进程父进程退出、子进程成为守护进程读或写但它们一样消耗系统资源可能导致所在的文 件系统无法卸载所以必须关闭这些文件这使得守护进程不再持有从其父进程继承过来的任何文件描述 符。 6) 将文件描述符号为 0 、 1 、 2 定位到 /dev/null 将守护进程的标准输入、标准输出以及标准错误重定向到 /dev/null 这使得守护进程的输出无处显示、 也无处从交互式用户那里接收输入。 7) 其它忽略 SIGCHLD 信号 处理 SIGCHLD 信号不是必须的但对于某些进程特别是并发服务器进程往往是特别重要的服务器 进程在接收到客户端请求时会创建子进程去处理该请求如果子进程结束之后父进程没有去 wait 回收子 进程则子进程将成为僵尸进程如果父进程 wait 等待子进程退出将又会增加父进程的负担、也就是增 加服务器的负担影响服务器进程的并发性能在 Linux 下可以将 SIGCHLD 信号的处理方式设置为 SIG_IGN也就是忽略该信号可让内核将僵尸进程转交给 init 进程去处理这样既不会产生僵尸进程、又 省去了服务器进程回收子进程所占用的时间。 三 示例 #include stdio.h
#include stdlib.h
#include unistd.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include signal.h// 文件权限掩码 umask 用于对新建文件的权限位进行屏蔽在 5.5.5 小节中有介绍。由于使用 fork 函数新
// 建的子进程继承了父进程的文件权限掩码这就给子进程使用文件带来了诸多的麻烦。因此把文件权限掩
// 码设置为 0确保子进程有最大操作权限、这样可以大大增强该守护进程的灵活性。设置文件权限掩码的函
// 数是 umask通常的使用方法为 umask(0)// umask(user file-creatiopn mode mask)是linux中的一个命令用于为用户文件创建权限掩码语法“umask [-S][权限掩码]”其中“权限掩码”是由3个八进制的数字所组成将现有的存取权限减掉权限掩码后即可产生建立文件时预设的权限。// umask命令可确定要在创建的任何文件或者目录上设置的默认权限。umask命令为用户文件创建掩码是创建文件或文件夹时默认权限的基础。通常我们可以使用chmod修改linux中文件的权限.umask的作用与chmod的效果相反具体看下面。// 若没有文件掩码时文件的默认权限为0666,文件夹的默认权限为0777。int main(void)
{pid_t pid;int i;/* 创建子进程 */pid fork();if (0 pid){perror(fork error);exit(-1);}else if (0 pid) // 父进程exit(0); // 直接退出/**子进程*//* 1.创建新的会话、脱离控制终端 */if (0 setsid()){perror(setsid error);exit(-1);}/* 2.设置当前工作目录为根目录 */if (0 chdir(/)){perror(chdir error);exit(-1);}/* 3.重设文件权限掩码 umask */umask(0);/* 4.关闭所有文件描述符 */for (i 0; i sysconf(_SC_OPEN_MAX); i)close(i);/* 5.将文件描述符号为 0、1、2 定位到/dev/null */open(/dev/null, O_RDWR);// 回到dup函数这个函数有一个参数就是文件描述符 这个函数创建出一个新的文件描述符这个文件描述符与参数中的这个文件描述符指向同一个文件 而且新的文件描述符总是取系统中最小的的整数值dup(0);dup(0);/* 6.忽略 SIGCHLD 信号 */signal(SIGCHLD, SIG_IGN);/* 正式进入到守护进程 */for (;;){sleep(1);puts(守护进程运行中......);}exit(0);
} 示例代码中其中第 4 步中调用 sysconf(_SC_OPEN_MAX) 用于获取当前系统允许进程打开的最大文件数量。 我们在守护进程中添加了死循环每隔 1 秒钟打印一行字符串信息接下来编译运行 gcc -o daemon_process daemon_process.c 运行之后没有任何打印信息输出原因在于守护进程已经脱离了控制终端它的打印信息并不会输出 显示到终端在代码中已经将标准输入、输出以及错误重定位到了/dev/null/dev/null 是一个黑洞文件自然是看不到输出信息。 使用ps -ajx命令查看进程如下所示 3.1 文件重定向 dup2 上述文件重定向部分 也可用dup2实现 // 5、重定向0,1,2if ((fd open(/dev/null, O_RDWR) ! -1)) // fd 3{dup2(fd, STDIN_FILENO);dup2(fd, STDOUT_FILENO);dup2(fd, STDERR_FILENO);// 6、关闭掉不需要的fdif (fd STDERR_FILENO)close(fd);} dup2(3, 2); 让2号文件描述符重定向到 log.txt其实就是把原本3号描述符保存的地址拷贝到2号描述符的位置。、 例子 #include unistd.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include stdio.h
#include string.hint main(){int fd open(log.txt, O_CREAT | O_RDWR, 0644);if(fd 0){perror(open);}dup2(fd, 1); // 文件重定向printf(newfd: hello, world\n); // 向1号文件描述符写入内容const char* buf oldfd: hello, world\n;write(fd, buf, strlen(buf)); // 向原本的log.txt对应的文件描述符写入内容return 0;
} 3.2 如何输出守护进程log到固定文件 解决办法如下我们在log.hpp打印日志文件那用宏定义一个serverTcp.log文件。 利用open函数打开此文件返回到logFd 利用dup2把标准输入标准输出重定向到logFd文件 注意 输出实时性。 s y n c只是将所有修改过的块的缓存排入写队列然后就返回它并不等待实际I / O操作结束。 系统精灵进程(通常称为u p d a t e )一般每隔3 0秒调用一次s y n c函数。这就保证了定期刷新内 核的块缓存。命令s y n c ( 1 )也调用s y n c函数。 函数f s y n c只引用单个文件(由文件描述符f i l e d e s指定)它等待I / O结束然后返回。f s y n c可/用于数据库这样的应用程序它确保修改过的块立即写到磁盘上。比较一下f s y n c和O _ S Y N C标 志(见3 . 1 3节)。当调用f s y n c时它更新文件的内容而对于O _ S Y N C则每次对文件调用w r i t e函数时就更新文件的内容。 fflush和fsync的联系和区别 [zz ] http://blog.chinaunix.net/u2/73874/showart_1421917.html 1.提供者fflush是libc.a中提供的方法fsync是系统提供的系统调用。2.原形fflush接受一个参数FILE *.fflush(FILE *);fsync接受的时一个Int型的文件描述符。fsync(int fd);3.功能fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。fsync是把内核缓冲刷到磁盘上。 c库缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘