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.
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;
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);
" 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
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.
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
[^] # Re: Oula...
Posté par gadiri . En réponse au message appel system execve dans fonction du noyau. Évalué à 1.
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 gadiri . En réponse au message appel system execve dans fonction du noyau. Évalué à 1.
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 gadiri . En réponse au message appel system execve dans fonction du noyau. Évalué à 1.
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 gadiri . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.
a+
[^] # Re: System
Posté par gadiri . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.
[^] # Re: System
Posté par gadiri . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.
[^] # Re: System
Posté par gadiri . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.
merci
a+
[^] # Re: Youpla tu a lu trop vite mon gars
Posté par gadiri . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.
[^] # Re: Utiliser un shell
Posté par gadiri . En réponse au message ecrire la liste des processus utilisateurs dans un fichier texte. Évalué à 1.
merci encore pour l'aide