Problème programme C avec primitives sur processus

Fermé
Ginzo_2924 Messages postés 1 Date d'inscription samedi 23 mars 2019 Statut Membre Dernière intervention 23 mars 2019 - Modifié le 30 avril 2019 à 13:05
Bonjour,

J'ai du mal à finir mon code C.

Il est sensé créer un processus enfant pour chaque fichier exécutable dans un répertoire donné en argument, puis rediriger la sortie standard vers un fichier portant le même nom que le fichier exécutable. Ce fichier est créé dans un dossier
/tmp/uid
, où
uid
correspond à l'UID de l'utilisateur courant.

Si le programme rencontre un dossier et qu'il peut y accéder, il recrée une instance du programme "exdir" via
fork
.

Merci d'avance*

#include <unistd.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <sys/times.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>

int main(int argc, char *argv[]) {
    if (argc == 0) {
        printf("%s", argv[1]);
    }

    DIR* dir;
    struct dirent *d;

    if ((dir = opendir(argv[1])) == NULL) {
        perror ("Cannot open .");
    }

    struct stat buf;
    int fd, reason;
    char res[PATH_MAX];
    pid_t p;
    uid_t uid;

    while ((d = readdir(dir)) != NULL) {
        stat(d->d_name, &buf);
        if (S_ISREG(buf.st_mode)) {
            if (access(d->d_name, 01) == 0) {
                switch (p = fork()) {
                    case -1:
                        perror("Erreur fork");
                        break;

                    case 0:
                        uid = getuid();
                        snprintf(res, PATH_MAX, "/tmp/%d/%s", uid, d->d_name);
                        if ((fd = open("/dev/null",O_WRONLY)) == -1)
                            perror("open erreur1");
                        if (dup2(fd, 1) ==  -1)
                            perror("open erreur2");
                        if (close(fd) == -1)
                            perror("open erreur3") ;
                        execlp("file", "file", "--mime-type", res, NULL);
                        perror("Erreur exec");
                        break;
                    default:
                        if ((wait(&reason)) == -1)
                            perror("Wait erreur");
                        break;
                }
            }
        } else if (S_ISDIR(buf.st_mode)) {
            /*DIR* dir1 == NULL;*/
            if (access(d->d_name,R_OK) == 0) {
                if (access(d->d_name,X_OK) == 0) {
                    switch (p = fork()) {
                        case -1:
                            perror("Erreur fork");
                            break;

                        case 0:
                            if ((fd = open("/dev/null",O_WRONLY)) == -1)
                                perror("open erreur4");
                            if (dup2(fd,1) ==  -1)
                                perror("open erreur5");
                            if (close(fd) == -1)
                                perror("open erreur6") ;
                            execlp(argv[0],"./exdir",NULL);
                            perror("Erreur exec");
                            break;

                        default:
                            if (wait(&reason) == -1)
                                perror("erreur wait");
                            break;
                    }
                }
            }
        }
    }
    if ((closedir(dir) == -1))
        perror("Erreur closedir");
    return 0;
}


* Ajout de la modération