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
Vielleicht ist Ihr 'my_printf' kaputt? Oder der segfault passiert nicht? Übrigens, wenn 'execve' erfolgreich ist, wirst du nie zur' signal' Funktion kommen ... –
Selbst mit einem normalen Druck funktioniert es nicht. Und wenn ich das angegebene Programm mit bash starte, segfault! – Orionss
Wie ich im Update sagte: 'execve' kehrt nicht zurück, wenn es erfolgreich ist. –