Я новичок в программировании на С, любая помощь приветствуется. Код будет использоваться для проверки того, активен ли 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 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 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;
}
}
Вызов kill
из вашего пользовательского kill
вызывает бесконечную рекурсию. Вы должны позвонить своему производителю, чтобы kill
что-то еще, например custom_kill
, и вызвать это из main
, а затем вызовы kill
перейдут к правильному удалению Unix kill(2)
(или они потерпят неудачу, если привязка не настроена правильно).
Причиной проблемы является бесконечный цикл (рекурсия) в функции kill()
. Трудно сказать, что вы пытаетесь сделать, но теперь эта реализация kill()
вызывает себя в первой строке (if ((kill (pid, sig)) == -1){
), и нет условие, чтобы остановить эту бесконечную рекурсию. Таким образом, он работает, пока система имеет достаточно памяти для продолжения. Чтобы исправить это, вам нужно исправить логику этой функции.
Если вы пытаетесь вызвать внешнюю функцию kill()
из своей собственной, проще переименовать вашу функцию:
int my_kill(pid_t pid, int sig)
{
// your current code
}
kill()
продолжает вызывать себя с теми же аргументами.