ps命令
用来看进程号的
ps -aux
ps -ajx
ps -aux | grep “syslogd”
等等
kill
用来结束进程的
kill -9 1234 ()1234是进程号
什么是守护进程(daemon)
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
特点
- 长期运行
- 与控制台脱离(控制台例子:linux的终端,tty…)
守护进程用来干嘛
作用:服务器一般都实现为守护进程
常见:syslogd------------系统日志
cron-----------------实现操作系统的时间管理,定时执行程序功能。
写守护进程
setsid
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
pid_t setsid(void);
setsid函数能够使进程完全独立出来,从而脱离所有其他进程的控制。
chidir
SYNOPSIS
#include <unistd.h>
int chdir(const char *path);
这里把路径改为当前路径
使用fork创建的子进程也继承了父进程的当前工作目录。由于在进程运行过程中,当前目录所在的文件系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等。改变工作目录的常见函数是chdir。
sysconf
NAME
sysconf - get configuration information at run time
SYNOPSIS
#include <unistd.h>
long sysconf(int name);
实现代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void create_deamon(void)
{
//1 创建子程序,终止父程序
pid_t pid = -1;
pid = fork();
if (pid < 0)
{
perror("fork");
exit(-1);
}
if (pid > 0)
{
exit(0);
}
// 在子程序中创建新会话
if (0 == pid )//记得是“==” 不要“=” ,之前一直实现不了就是因为等号的问题
{
pid_t pid_s = -1;
pid_s = setsid();
if (-1 == pid_s) //记得是“==” 不要“=” ,之前一直出错就是因为等号的问题
{
perror("setsid");
exit(-1);
}
printf("the new session ID of the calling precess is %d\n",pid_s);
//改变工作目录为当前目录
chdir("/");
//重设文件创建掩码
umask(0);
//关闭文件描述符
//有好多个文件,而且是动态的,全都要关闭,所以通过sysconf,里面传参看man手册,得到最大的能打开的fd数
int open_max = 0;
open_max = sysconf(_SC_OPEN_MAX);
int i = 0;
for (i = 0;i < open_max; i++)
{
close(i);
}
//把标准输入输出定位到/dev/null 因为全都关了,所以按顺序fd分别是012,对应标准输入输出
open("/dev/null",O_RDWR);
open("/dev/null",O_RDWR);
int fd = open("/dev/null",O_RDWR);
printf("???fd = %d",fd);
}
}
int main()
{
create_deamon();
while(1)
{
printf("happy\n");
sleep(1);
}
return 0;
}