• [^] # Re: Oula...

    Posté par . En réponse au message appel system execve dans fonction du noyau. Évalué à 1.

    Qu'est ce que tu cherche a faire?
    j'ai une fonction qui s'execute correctement en user space effectivement. Le but que je suis est d'implementer dans le noyau un mécanisme d'empechement d'envoi de message sur une file de messages IPC. Donc à la création d'une nouvelles file de messages, le noyau doit isoler deux numeros de processus du user courant. Chaque fois que un de ces deux processus voudra envoyer un msg sur cette file, le noyau va afficher un msg indiquant qu'il ne peut pas. Le programme qui est ci-dessous: liste les processus du user courant, en choisi deux aléatoirement et va écrire les numéros dans deux fichiers qui seront mappés en memoire en vu d'un partage futur avec d'autres processus. J'ai essayé d'integrer cela dans /ipc/msg.c comme fonction qui sera appelé dans la fonction msgget(). Mais j'ai plein d'erreurs. Les fonctions standard n'étant pas dispo dans le kernel space, pour gagner du temps j'avais pensé à execve.
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <time.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #define FILE_LENGTH 0x100

    #define MAX_PID 32768
    #define ID_UTILISATEUR 501

    char s[100];
    int v[10000];
    struct stat buffer;
    int i,k,t1,t2;//,stop1,stop2;
    int stop1,stop2;
    int j=0;

    main()
    {
    int fd;
    void* file_memory1,*file_memory2;
    char* arg[2];
    arg[0]= "/home/gadiri/test/stop1";
    arg[1]= "/home/gadiri/test/stop2";
    srand(time(NULL));

    for(i=0;i<MAX_PID;i++)
    {
    sprintf(s,"/proc/%d",i);
    if((stat(s,&buffer)!=-1) && (buffer.st_uid==ID_UTILISATEUR))
    {
    v[j]=i;
    j++;
    k=j;
    }
    }
    t1=rand()%k;
    t2=rand()%k;
    stop1=v[t1];
    stop2=v[t2];
    printf("les processus interdits ont les numeros: v[%d]= %d et v[%d]= %d \n",t1,stop1,t2,stop2);

    srand (time (NULL));

    /* Prepare le fichier où on va stocker l'id du 1er proc interdit d'envoi de msg */
    fd = open (arg[0], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    lseek (fd, FILE_LENGTH+1, SEEK_SET);
    write (fd, "", 1);
    lseek (fd, 0, SEEK_SET);

    /* mapping du fichier en memoire. */
    file_memory1 = mmap (0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
    close (fd);
    /* Ecriture du numero du processus en mémoire dans la zone du mapping. */
    sprintf((char*) file_memory1, "%d\n", stop1);
    /* Liberation de la mémoire. */
    munmap (file_memory1, FILE_LENGTH);

    /* Prepare le fichier où on va stocker l'id du 1er proc interdit d'envoi de msg */
    fd = open (arg[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    lseek (fd, FILE_LENGTH+1, SEEK_SET);
    write (fd, "", 1);
    lseek (fd, 0, SEEK_SET);

    /* mapping du fichier en memoire. */
    file_memory2 = mmap (0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
    close (fd);
    /* Ecriture du numero du processus en mémoire dans la zone du mapping. */
    sprintf((char*) file_memory2, "%d\n", stop2);
    /* Liberation de la mémoire. */
    munmap (file_memory2, FILE_LENGTH);

    }