环境
- ubuntu 18.04 64-bit
前言
最近碰到个需求,需要使用 C
语言来实现当前程序的自重启。其实这样的需要,在实际项目中还是蛮常见的,如程序升级、某些暂时无法解决的问题导致的业务卡死等等。本篇使用的是在 ubuntu
系统下,通过系统内核命令的方式来实现程序重启这个目标。
代码实现
这里用到的内核命令是 /proc/self/exe
,它代表的是当前程序,执行它就相当于程序重启了,看示例
/* test.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char buf[32] = {};
// 参数
char *exec_argv[] = { argv[0], buf, 0 };
// 统计重启次数
int count = argc > 1 ? atoi(argv[1]) : 0;
printf("Running: %s %d\n", argv[0], count);
// 次数递增1
snprintf(buf, sizeof(buf), "%d", count+1);
sleep(3);
// 重启
execv("/proc/self/exe", exec_argv);
// 这个printf不会执行
printf("return...");
return 0;
}
编译程序
gcc test.c -o test
执行 ./test
这里还有个常见的应用就是通过 /proc/self/exe
来获取应用程序的决定路径,看下面的示例代码
#include <unistd.h>
#include <stdio.h>
int main(int argc , char* argv[])
{
char buf[1024] = { 0 };
int n;
n = readlink("/proc/self/exe" , buf , sizeof(buf));
if( n > 0 && n < sizeof(buf))
{
printf("%s\n" , buf);
}
return 0;
}