这是我在文件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
,但仍然得到相同的错误?
1条答案
按热度按时间dsekswqp1#
如果
fopen
无法打开文件并返回NULL
,则程序具有未定义的行为。将空FILE
指针传递给fprintf
或fputs
具有未定义的行为,因为这些函数期望有效的指针,并且不检查空。fopen
可能因多种原因而失败,例如:如果进程不是以root身份运行。测试
fopen
的返回值,并使用显式错误消息报告问题。readlink
也可能失败,特别是如果/proc/xxx/exe
没有在目标系统上实现为符号链接。下面是一个带有错误检查功能的修改版本: