fprintf cause segmentation fault核心转储

ufj5ltwl  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(184)

这是我在文件a.c中的代码:

int auto_reboot() {
    char str[1000];
    char buf[1000];

    snprintf(str, sizeof(str), "/proc/%d/exe", getpid()); 
    readlink(str, buf, sizeof(str));
    FILE *fp;
    fp = fopen("/etc/systemd/system/watchddog.service", "w");
    fprintf(fp, "[Unit]\nDescription=nginx - high performance web server\n[Service]\nType=forking\nRestart=always\nExecStart=\n[Install]\nWantedBy=multi-user.target");
    fclose(fp);

    return 1;
}

为什么fprintf会导致分段错误核心转储?
我尝试将其更改为fputs,但仍然得到相同的错误?

dsekswqp

dsekswqp1#

如果fopen无法打开文件并返回NULL,则程序具有未定义的行为。将空FILE指针传递给fprintffputs具有未定义的行为,因为这些函数期望有效的指针,并且不检查空。
fopen可能因多种原因而失败,例如:如果进程不是以root身份运行。
测试fopen的返回值,并使用显式错误消息报告问题。
readlink也可能失败,特别是如果/proc/xxx/exe没有在目标系统上实现为符号链接。
下面是一个带有错误检查功能的修改版本:

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int auto_reboot(void) {
    char str[100];
    char buf[1000];

    snprintf(str, sizeof str, "/proc/%d/exe", getpid()); 
    if (readlink(str, buf, sizeof buf) <= 0)
        strcpy(buf, str);

    const char *filename = "/etc/systemd/system/watchddog.service";
    FILE *fp = fopen(filename, "w");
    if (fp == NULL) {
        fprintf(stderr, "cannot open %s: %s\n", filename, strerror(errno));
        return -1;
    }
    fprintf(fp, "[Unit]\n"
                "Description=nginx - high performance web server\n"
                "[Service]\n"
                "Type=forking\n"
                "Restart=always\n"
                "ExecStart=\n"
                "[Install]\n"
                "WantedBy=multi-user.target\n");
    fclose(fp);
    return 1;
}

相关问题