2014-11-09 54 views
0

我是C编程的新手,任何帮助都不胜感激。该代码将用于检查一个pid是否仍然有效。提供pid文件路径的参数通过命令行传递。请参阅下面的Valgrind和GDB错误以及代码。线程1中的堆栈溢出:无法将堆栈增长到0xffe601ff8 Valgrind错误

**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; 
    } 
} 
+4

'kill()'继续使用相同的参数调用自己。 – Galik 2014-11-09 03:06:24

回答

0

问题的原因是在功能kill()无限循环(递归)。很难说,你正在尝试做什么,但是现在这个kill()的实现在第一行(if ((kill (pid, sig)) == -1){)中自行调用,并且没有条件阻止这个无限递归。所以它可以在系统有足够内存的情况下运行。要修复它,你需要纠正这个函数的逻辑。

如果你正试图从自己的一个调用外部函数kill(),很容易重命名功能:

int my_kill(pid_t pid, int sig) 
{ 
    // your current code 
} 
+0

无限递归可能比循环更好的描述。 – 2014-11-09 03:08:04

+0

@CharlieBurns,谢谢你的纠正! – Ilya 2014-11-09 03:13:44

2

调用从您的自定义kill导致无限递归内kill。你应该调用你的自定义kill其他东西,如custom_kill,并从main调用那个,然后调用kill将转到正确的Unix kill(2)(否则如果链接设置不正确,它们将失败)。