项目重要实现守护进程,搜索学习一些相关内容:
linux环境下获得进程的pid
1、进程查询函数
原理: 使用 popen函数 + pidof命令 查询对应进程的pid,该方法的缺点就是不能像windows那样读取所有进程名从而获取该进程运行的数量。所以,如果一个程序加载多个进程(同程序进程名相同,pid不同),使用该方法只能获取最后一个启动的进程pid。
popen属于标准I/O函数库中函数,使用该函数启动另外一个进程去执行一个shell命令行。
这里我们称调用popen的进程为父进程,由popen启动的进程称为子进程。
popen函数还创建一个管道用于父子进程间通信。父进程要么从管道读信息,要么向管道写信息,至于是读还是写取决于父进程调用popen时传递的参数。
实现函数如下,函数参数输入进程名,返回进程的pid,如果返回-1则表示进程不存在或未运行。
pid_t getProcessPidByName(const char *proc_name)
{
FILE *fp;
char buf[100];
char cmd[200] = {'\0'};
pid_t pid = -1;
sprintf(cmd, "pidof %s", proc_name);
if((fp = popen(cmd, "r")) != NULL)
{
if(fgets(buf, 255, fp) != NULL)
pid = atoi(buf);
}
pclose(fp);
return pid;
}
2、进程守护代码
实现上windows代码已经比较详细了,所以这里linux下简单实现。代码如下:
int main(int argc, char *argv[])
{
while(1)
{
if(getProcessPidByName("qtcreator") == -1)
{
printf("open APP qtcreator...");
system("qtcreator &"); //启动软件
}
sleep(5); //需要大于软件启动时间
}
return 0;
}