2017-01-18 6 views
0

Ich habe ein Programm, das eine Verzweigung erstellt, die Execve verwendet, um ein Programm auszuführen, das über einen SegFault verfügt und nach dem Abfangen des Signals beendet wird. In meinem Signalhandler sollte ich "Segmentierungsfehler (Core Dumped)" erhalten, aber es wird nichts geschrieben. Also frage ich: Wie geht man mit einem Segfault-Signal in einem Child-Prozess um? Mein Code ist folgende:SIGSEGV-Signalverarbeitung in einem untergeordneten Prozess

int  child_management(char **env, char **arguments) 
{ 
    char **paths; 
    char *current_path; 
    char *target_path; 
    int found; 
    int i; 

    i = -1; 
    found = 0; 
    paths = get_paths(env); 
    if (execve(arguments[0], arguments, env) == -1) 
    { 
     while (paths[++i] != NULL) 
     { 
      current_path = my_strcat(paths[i], "/"); 
      target_path = my_strcat(current_path, arguments[0]); 
      found = (execve(target_path, arguments, env) == -1 && found == 0) ? 0 : 1; 
      free(current_path); 
      free(target_path); 
     } 
     if (!found && !is_existing_builtin(arguments[0])) 
     my_printf("%s: Command not found.\n", arguments[0]); 
    } 
    free(arguments); 
    free(paths); 
    if (signal(SIGSEGV, segf_handler) == SIG_ERR); 
    exit(0); 
} 

void segf_handler() 
{ 
    my_printf("Segmentation fault (Core dumped)\n"); 
} 

int  execute_program(char *str, char **av, char **env) 
{ 
    pid_t pid; 
    char **arguments; 

    pid = fork(); 
    arguments = my_str_explode(str, ' '); 
    if (pid > 0) 
    { 
     parent_management(pid, arguments, env); 
    } 
    else if (pid == 0) 
    { 
     child_management(env, arguments); 
    } 
} 

Bitte beachten Sie, dass ich ein Exercice tue und ich bin nicht eine andere Funktion als Signal sagen, damit Sie nicht mich über sigaction

+0

Vielleicht ist Ihr 'my_printf' kaputt? Oder der segfault passiert nicht? Übrigens, wenn 'execve' erfolgreich ist, wirst du nie zur' signal' Funktion kommen ... –

+0

Selbst mit einem normalen Druck funktioniert es nicht. Und wenn ich das angegebene Programm mit bash starte, segfault! – Orionss

+1

Wie ich im Update sagte: 'execve' kehrt nicht zurück, wenn es erfolgreich ist. –

Antwort

2

Sie fangen können nicht verwenden dürfen das SEGV-Signal innerhalb des Kinds, weil der Aufruf von execve den Code ersetzt, der im Kind mit diesem Programm ausgeführt wird.

Sie können jedoch das CHLD-Signal in der übergeordneten abfangen, wenn der Kindprozess stirbt. Sie müssen den Status von wait() überprüfen, um zu sehen, wie/warum er starb.

+0

Das löste mein Problem, weil es mich veranlasste jemanden zu fragen, ob ich die Makros benutzen könnte und ich könnte! Vielen Dank ! – Orionss

Verwandte Themen