欢迎访问我的网站,希望内容对您有用,感兴趣的可以加入我们的社群。

C语言实现程序自动重启

C/C++ 迷途小书童 4年前 (2021-01-07) 2947次浏览 0个评论

环境

  • 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

这里还有个常见的应用就是通过 /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;
}

参考资料

喜欢 (0)

您必须 登录 才能发表评论!