Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.62 KB | None | 0 0
  1. //EXO2
  2. void fluxStandard(int argc, char** argv){
  3. printf("EXO 2 Redirection flux standard:\n");
  4.  
  5. if(argc < 2){// argc contient la longueur de l'array argv, argv[0]=nom de l'executable, argv[1]= 1e argument, ...
  6. // fprintf write to file output stream, stdout = sortie standard = 1
  7. // stderr = sortie d'erreurs standard = 2
  8. errno = EINVAL;
  9. fprintf(stderr,"Parent: Erreur: %s (Il faut saisir un argument quelconque)\n",strerror(errno));
  10. }else {
  11. fprintf(stdout,"Parent: Sortie standard: argument: %s\n", argv[1]); // = printf() écrit aussi sur stdout
  12.  
  13. fprintf(stderr,"Parent: Sortie d'erreurs: %s\n\n", strerror(errno));
  14. // if (argv[2] != NULL){
  15. // printf("Fin de l'exo 2 !");
  16. // exit(EXIT_SUCCESS);
  17. // }
  18. }
  19.  
  20. if (argv[2] == NULL)
  21. {
  22. int f = fork();
  23.  
  24. if(f == -1){
  25. perror("fork()");
  26. exit(EXIT_FAILURE);
  27. }
  28. // Process parent
  29. else if (f > 0){
  30. printf("Parent: pid %d, pid enfant: %d\n", getpid(), f);
  31.  
  32. int status = -1;
  33. int w = wait(&status);
  34.  
  35. if (w == -1){
  36. perror("wait()");
  37. exit(EXIT_FAILURE);
  38. }
  39. else if ( WIFEXITED(status) ){
  40. printf("Parent: le processus enfant %d est terminé, code de retour du fils: %d\n", w, WEXITSTATUS(status));
  41. printf("Fin de l'exo 2 !\n\n");
  42. // exit(EXIT_SUCCESS); //On ne termine pas le parent pour les autres exo
  43. }
  44. else{ //possibilité de testé si le process a été terminé par signaux
  45. printf("Parent: le processus enfant %d c'est terminé autrement que par exit ou retour du main", w);
  46. //exit(EXIT_FAILURE);
  47. }
  48.  
  49.  
  50. }
  51. // Process enfant
  52. else {
  53. printf("Enfant: pid %d, ppid: %d\n", getpid(), getppid());
  54.  
  55. //on ferme la sortie standard, printf ne print plus dans rien
  56. close(1);
  57.  
  58. // mkstemp(template) créer un fichier temporaire et l'ouvre en prenant le template
  59. // comme nom, et remplace les XXXXXX par une string qui rend le fichier unique
  60. // The file is created with permissions 0600, that is,
  61. // read plus write for owner only
  62. char template[] = "/tmp/proc-exercise-XXXXXX";
  63. int tempFileDesc = mkstemp(template); // mkstemp retourne le descripteur du fichier
  64.  
  65. if(tempFileDesc == -1){
  66. fprintf(stderr,"Erreur mkstemp(): %s\n",strerror(errno));
  67. exit(EXIT_FAILURE);
  68. }
  69. else{
  70. // On remplace la sortie standard 1 (STDOUT) par notre fichier temporaire
  71. // printf fonctionne à nouveau mais print dans le fichier temporaire
  72. int oldDesc = tempFileDesc;
  73. int newDesc = dup2(tempFileDesc, 1);
  74.  
  75. if (newDesc == -1){
  76. perror("Erreur dup2(): ");
  77. exit(EXIT_FAILURE);
  78. }
  79. else {
  80. // on remarque 1 et 1:
  81. // Quand le fichier est ouvert avec mkstemp qui l'ouvre avec open(2),
  82. // le descripteur affecté au fichier serait le premier disponible sur la table des descripteurs, donc
  83. // comme on a fermé 1 le descripteur de notre nouveau fichier était déjà 1 ???
  84.  
  85. printf("Enfant: Ancien descripteur du fichier temporaire: %d, Nouveau descripteur: %d\n", oldDesc, newDesc);
  86. }
  87. }
  88.  
  89. // execv permet de remplacer l'image du process courtant par une autre
  90. // en 1e argument on donne le chemin d'un exectuable
  91. // en 2e on donne une array de paramètre pour l'execution du programme
  92. // on reconstruit l'array des params pour en ajouter un qui permettra de bloquer l'execution récursive de fork() à exec()
  93. char* param[] = {argv[0], argv[1], "-1", NULL};
  94. execv(argv[0], param);
  95.  
  96. close(tempFileDesc);
  97.  
  98. exit (EXIT_SUCCESS);
  99. }
  100. }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement