我是C编程新手,感谢任何帮助。该代码将用于检查pid是否仍处于活动状态。提供pid文件路径的参数通过命令行传递。请参阅下面的Valgrind和GDB错误以及代码。
**Valgrind Error**
==6553== Memcheck, a memory error detector
==6553== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==6553== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==6553== Command: ./pid1108_2 /var/run/httpd/httpd.pid
==6553==
==6553== Stack overflow in thread 1: can't grow stack to 0xffe601ff8
==6553==
==6553== Process terminating with default action of signal 11 (SIGSEGV)
==6553== Access not within mapped region at address 0xFFE601FF8
==6553== at 0x40069F: kill (in /home/ehubbard/C_Checks/pid1108_2)
==6553== If you believe this happened as a result of a stack
==6553== overflow in your program's main thread (unlikely but
==6553== possible), you can try to increase the size of the
==6553== main thread stack using the --main-stacksize= flag.
==6553== The main thread stack size used in this run was 10485760.
==6553== Stack overflow in thread 1: can't grow stack to 0xffe601ff0
==6553==
==6553== Process terminating with default action of signal 11 (SIGSEGV)
==6553== Access not within mapped region at address 0xFFE601FF0
==6553== at 0x4801661: _vgnU_freeres (vg_preloaded.c:58)
==6553== If you believe this happened as a result of a stack
==6553== overflow in your program's main thread (unlikely but
==6553== possible), you can try to increase the size of the
==6553== main thread stack using the --main-stacksize= flag.
==6553== The main thread stack size used in this run was 10485760.
==6553==
==6553== HEAP SUMMARY:
==6553== in use at exit: 0 bytes in 0 blocks
==6553== total heap usage: 1 allocs, 1 frees, 568 bytes allocated
==6553==
==6553== All heap blocks were freed -- no leaks are possible
==6553==
==6553== For counts of detected and suppressed errors, rerun with: -v
==6553== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
**GDB Error**
Program received signal SIGSEGV, Segmentation fault.
0x000000000040068f in kill ()`enter code here`
#include <stdio.h> //Needed for standard I/O
#include <stdlib.h> //Needed for exit
#include <sys/types.h> //Needed for kill function
#include <signal.h> //Needed for kill function
#include <inttypes.h>
#include <iso646.h>
int kill(pid_t pid, int sig);
int main(int argc, char *argv[])
{
FILE *fp;
int pid;
fp = fopen(argv[1], "r");
if (fp == NULL){
printf("Pid file doesn't exist:");
return 2;}
else {
fscanf(fp, "%d", &pid);
printf("Pid number is %d", pid);
fclose(fp);
}
kill(pid, 0);
}
int kill(pid_t pid, int sig)
{
if ((kill (pid, sig)) == -1){
printf("Pid %d is no longer valid", pid);
return 2;
}
else if ((kill (pid, sig)) == 0){
printf("Pid %d is active.", pid);
return 0;
}
else{
printf("Could not determine value!");
return 2;
}
}
答案 0 :(得分:2)
在自定义kill
中调用kill
会导致无限递归。您应该调用自定义kill
其他内容,例如custom_kill
,然后从main
调用,然后调用kill
将转到正确的Unix kill(2)
(如果未正确设置链接,它们将失败。)
答案 1 :(得分:0)
问题的原因是函数kill()
中的无限循环(递归)。很难说,你想要做什么,但现在kill()
的这个实现在第一行(if ((kill (pid, sig)) == -1){
)中调用自己,并且没有条件来阻止这种无限递归。所以当系统有足够的内存来继续时,它可以工作。要修复它,你需要纠正这个函数的逻辑。
如果您尝试从自己的函数调用外部函数kill()
,则更容易重命名您的函数:
int my_kill(pid_t pid, int sig)
{
// your current code
}