目录
一、要求
在Linux系统下编写一个守护进程,该守护进程能够记录系统运行期间所有运行的进程。记录信息包括:进程PID,可执行程序名称,用户名,创建时间等。
二、守护进程
1.概念
2.编写
三、实现
1.对于守护进程的编写,按照上述步骤即可以写出,不会太难。
2.要实现进程信息的记录,在终端中我们知道可以使用ps命令来查看进程信息,所以不妨考虑在C程序中执行shell命令来完成进程信息记录,正好可以使用system函数来执行shell命令。
3.但执行shell命令如何把终端中的输出信息给保存到文件中呢?于是又想到了重定向可以实现此功能,比如ps -aux >> log.txt命令就可以将进程信息保存到当前目录的log.txt文件中,会自动创建该文件
四、源码
注意:对于chdir()函数和system函数的说明:如果system函数中执行的shell命令重定向的位置没有使用绝对路径,则chdir中的路径最好是绝对路径,不然重定向可能会出错,因为可能找不到路径。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <time.h>
#include <syslog.h>
#include <stdbool.h>
static bool flag = true;
int init_daemon(void)
{
int pid;
int i;
pid = fork();
//子进程pid为0
if(pid > 0) {
exit(0); //结束父进程,使得子进程成为后台进程
}
else if(pid < 0) {
return -1;
}
//建立一个新的进程组,在这个新的进程组中,子进程成为这个进程组的首进程,以使该进程脱离所有终端
setsid();
//改变工作目录,使得进程不与任何文件系统联系,使用绝对路径,以免开机自启后找不到文件路径
chdir("/home/xinger/Documents/OS/守护进程/");
//关闭所有从父进程继承的不再需要的文件描述符
for(i=0;i< NOFILE;close(i++));
//将文件当时创建屏蔽字设置为0
umask(0);
return 0;
}
int main()
{
//创建守护进程
init_daemon();
system("echo 进程信息 >> log");
while(flag) {
system("date >> log");//记录每次向log文件写入进程信息的时间
system("ps -aux >> log");//写入进程信息
sleep(20);
}
return 0;
}