Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //EXO2
- void fluxStandard(int argc, char** argv){
- printf("EXO 2 Redirection flux standard:\n");
- if(argc < 2){// argc contient la longueur de l'array argv, argv[0]=nom de l'executable, argv[1]= 1e argument, ...
- // fprintf write to file output stream, stdout = sortie standard = 1
- // stderr = sortie d'erreurs standard = 2
- errno = EINVAL;
- fprintf(stderr,"Parent: Erreur: %s (Il faut saisir un argument quelconque)\n",strerror(errno));
- }else {
- fprintf(stdout,"Parent: Sortie standard: argument: %s\n", argv[1]); // = printf() écrit aussi sur stdout
- fprintf(stderr,"Parent: Sortie d'erreurs: %s\n\n", strerror(errno));
- // if (argv[2] != NULL){
- // printf("Fin de l'exo 2 !");
- // exit(EXIT_SUCCESS);
- // }
- }
- if (argv[2] == NULL)
- {
- int f = fork();
- if(f == -1){
- perror("fork()");
- exit(EXIT_FAILURE);
- }
- // Process parent
- else if (f > 0){
- printf("Parent: pid %d, pid enfant: %d\n", getpid(), f);
- int status = -1;
- int w = wait(&status);
- if (w == -1){
- perror("wait()");
- exit(EXIT_FAILURE);
- }
- else if ( WIFEXITED(status) ){
- printf("Parent: le processus enfant %d est terminé, code de retour du fils: %d\n", w, WEXITSTATUS(status));
- printf("Fin de l'exo 2 !\n\n");
- // exit(EXIT_SUCCESS); //On ne termine pas le parent pour les autres exo
- }
- else{ //possibilité de testé si le process a été terminé par signaux
- printf("Parent: le processus enfant %d c'est terminé autrement que par exit ou retour du main", w);
- //exit(EXIT_FAILURE);
- }
- }
- // Process enfant
- else {
- printf("Enfant: pid %d, ppid: %d\n", getpid(), getppid());
- //on ferme la sortie standard, printf ne print plus dans rien
- close(1);
- // mkstemp(template) créer un fichier temporaire et l'ouvre en prenant le template
- // comme nom, et remplace les XXXXXX par une string qui rend le fichier unique
- // The file is created with permissions 0600, that is,
- // read plus write for owner only
- char template[] = "/tmp/proc-exercise-XXXXXX";
- int tempFileDesc = mkstemp(template); // mkstemp retourne le descripteur du fichier
- if(tempFileDesc == -1){
- fprintf(stderr,"Erreur mkstemp(): %s\n",strerror(errno));
- exit(EXIT_FAILURE);
- }
- else{
- // On remplace la sortie standard 1 (STDOUT) par notre fichier temporaire
- // printf fonctionne à nouveau mais print dans le fichier temporaire
- int oldDesc = tempFileDesc;
- int newDesc = dup2(tempFileDesc, 1);
- if (newDesc == -1){
- perror("Erreur dup2(): ");
- exit(EXIT_FAILURE);
- }
- else {
- // on remarque 1 et 1:
- // Quand le fichier est ouvert avec mkstemp qui l'ouvre avec open(2),
- // le descripteur affecté au fichier serait le premier disponible sur la table des descripteurs, donc
- // comme on a fermé 1 le descripteur de notre nouveau fichier était déjà 1 ???
- printf("Enfant: Ancien descripteur du fichier temporaire: %d, Nouveau descripteur: %d\n", oldDesc, newDesc);
- }
- }
- // execv permet de remplacer l'image du process courtant par une autre
- // en 1e argument on donne le chemin d'un exectuable
- // en 2e on donne une array de paramètre pour l'execution du programme
- // on reconstruit l'array des params pour en ajouter un qui permettra de bloquer l'execution récursive de fork() à exec()
- char* param[] = {argv[0], argv[1], "-1", NULL};
- execv(argv[0], param);
- close(tempFileDesc);
- exit (EXIT_SUCCESS);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement