fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/wait.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7.  
  8. int main(int argc, char *argv[]) {
  9. if (argc == 2) {
  10. // TODO: Aufgabe a)
  11. // Wenn genau ein Argument übergeben wurde, gib den ersten Buchstaben aus.
  12. printf("%c\n", argv[1][0]);
  13. fflush(stdout); // Wichtiger Flush, damit Ausgabe direkt erfolgt
  14. return 0;
  15. }
  16.  
  17. if (argc > 2) {
  18. // TODO: Aufgabe b) und c)
  19. // Gib den ersten Buchstaben von argv[1] aus.
  20. printf("%c\n", argv[1][0]);
  21. fflush(stdout);
  22.  
  23. pid_t pid = fork();
  24.  
  25. if (pid == 0) {
  26. // Kindprozess: Bereite neue Argumentliste vor (argv[1] wird entfernt)
  27. char *new_args[argc]; // Platz für argv[0] + restliche Argumente + NULL
  28.  
  29. new_args[0] = argv[0]; // Programmname bleibt gleich
  30.  
  31. for (int i = 2; i < argc; i++) {
  32. new_args[i - 1] = argv[i]; // Argumente um eins nach vorn verschieben
  33. }
  34.  
  35. new_args[argc - 1] = NULL; // Null-Terminierung für execvp
  36.  
  37. // Neue Programm-Instanz mit gekürzter Argumentliste aufrufen
  38. execvp(new_args[0], new_args);
  39.  
  40. // Nur bei Fehler erreicht
  41. perror("execvp");
  42. exit(1);
  43. }
  44.  
  45. if (pid > 0) {
  46. // Elternprozess wartet und gibt dann denselben Buchstaben erneut aus
  47. wait(NULL);
  48. printf("%c\n", argv[1][0]);
  49. fflush(stdout);
  50. }
  51.  
  52. if (pid < 0) {
  53. perror("fork");
  54. exit(1);
  55. }
  56. }
  57.  
  58. return 0;
  59. }
  60.  
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
Standard output is empty