gadiri a écrit 9 commentaires

  • [^] # Re: Oula...

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

    Et je ne vois pas à quoi servait le lseek/write/lseek au début
    l'idée est de s'assurer que le fichier est assez grand pour contenir un entier non signé.

    Remplace ton "int fd" par un "FILE *f"
    qd j'ai fait cela j'ai eu des erreurs lors dela compilation du noyau. les fonctions de <stdio.h> ne sont pas reconnues.
    les mmap et munmap ne sont pas indispensables.
  • [^] # 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);

    }
  • [^] # Re: Heuu

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

    " le noyau il la connait deja la liste de processus qu'il fait tourner il a pas besoin de ps pour qu'on le lui dise." c'est pas de ça qu'il s'agit. la question était si on peut utiliser un des appels système dans une fonction qu'on va incorporer au noyau cette fonction n'étant pas necessairement un appel système.
    cette macro (syscall3)je l'ai mise car qd je compile le noyau, il indique 'warning: implicit declaration of function `execve. c'est pourquoi je l'ai integré. les includes que j'ai utilisé sont:
    #include <linux/linkage.h>
    #include <linux/kernel.h>
    #include <linux/types.h>
    #include <linux/unistd.h>

    à propos du "ps " ce problème là est fini, il s'agit d'autre chose.
    je ne m'y connais pas très bien, vous l'aurez remarqué, et je bidouille effectivement. si je vous fais perdre votre temps, ne vous sentez pas obligé de repondre
    merci
  • [^] # Re: System

    Posté par  . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.

    merci beaucoups, j'ai pu le faire fonctionner
    a+
  • [^] # Re: System

    Posté par  . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.

    j'ai essayé mais j'ai pas reussi à obtenir qcqchose. mais je ne maitrise pas très bien le c. J'ai utilisé un malloc pour allouer de la mémoire au struct, mais y'a pleins d'erreurs. j'essaye encore.
  • [^] # Re: System

    Posté par  . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.

    merci pour cette solution, vous m'avez bien aidé.
  • [^] # Re: System

    Posté par  . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.

    ça marche très bien. C'est pas une application multithreads. donc tt va bien
    merci
    a+
  • [^] # Re: Youpla tu a lu trop vite mon gars

    Posté par  . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.

    merci pour toutes les précisions je vais essayer avec le script shell
  • [^] # Re: Utiliser un shell

    Posté par  . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.

    je veux implementer un appel systeme qui, qd il sera invoqué, ira ecrire la liste des processus du user dans le fichier spécifié.
    merci encore pour l'aide