Ich habe den folgenden Code:C - Programm beendet (fork() und exec())
int main(int argc, char **argv)
{
char *program;
char stringa[1000] = "";
int num = 123;
char snum[5];
program = argv[1];
sprintf(stringa, "./%s", program);
pid_t pid = fork();
if (pid < 0) {
perror("fork failed.");
exit(1); }
else if (pid == 0) {
char* args[] = {stringa, NULL};
execv(args[0], args);
}
else {
char procmon_str[] = "./procmon ";
num = pid;
sprintf(snum, "%d",num);
printf("PID of child is %s", snum);
char* args2[] = {procmon_str, snum, NULL};
execv(args2[0], args2);
sleep(20);
kill(num, SIGTERM);
sleep(2);
int parent_pid = getpid();
printf("PID of parent is %d", parent_pid);
kill(parent_pid, SIGTERM);
}
wait(NULL);
return 0;
}
Die Idee ist, mit dem Programm mit 1 Befehlszeilenargument zu nennen, die einen Namen eines anderen kompilierte C ist Programm im selben Ordner. Ich möchte dieses Programm aus dem C-Code (daher die Verwendung von fork()
) ausführen, und gleichzeitig möchte ich ein anderes Programm aus dem parent
Teil der fork()
starten.
Der Teil, der perfekt in dem child
Teil fork()
Werke ist, aber wenn ich es durch die Schale laufen, sagt er Terminated
direkt nach und führen Sie den Code nicht in dem parent
Teil der fork()
.
Warum ist das?
Sie warten nicht, bis das Kind mit 'wait()' fertig ist. Der Platz am Ende von './Procmon' verhindert, dass das Programm ausgeführt wird. – Barmar
'execv()' kehrt normalerweise nicht zurück, weil es den aktuellen Prozess durch das Programm ersetzt, das Sie ausführen möchten. Wenn es zurückkommt, heißt das, dass es einen Fehler bekommen hat, also sollten Sie die Fehlermeldung mit 'perror()' ausdrucken. – Barmar
Wenn das Programm richtig funktioniert, werden alle Sachen, die Sie nach 'execv' im Elternteil haben, niemals ausgeführt. Sie sollten es zuerst setzen. – Barmar