Bonjour, je dois réaliser un serveur d’informations du système. Un client pourra émettre une requête pour demander :
– les informations concernant un utilisateur à partir de son uid (login, nom réel, groupe, répertoire dédié, shell utilisé) ;
– les informations sur un processus en fonction de son pid (commande, propriétaire, état) ;
J'ai une erreur de segmentation que je n'arrive pas à résoudre :
Code client :
Code serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <pwd.h> #include <fcntl.h> #include <mqueue.h> #include <string.h> #include <sys/stat.h> #define NOM_FILE "/question_f" struct question{ int type; int data; char * nomTubeRep; }; int main(){ printf("Entrez le type de la question(1 = question sur l'utilisateur\n"); printf(",2 sur un programme : "); int type; int data; scanf("%d",&type); printf("\nMaintenant entrez l'uid ou le pid : "); scanf("%d",&data); char * nomFileRep = ""; printf("Maintenant entrez le nom que vous souhaitez donner pour recevoir\n"); printf("la reponse(le nom doit être précédé d'un \'/\' : "); scanf("%s",nomFileRep); char * msg = ""; char * dataS =""; sprintf(msg,"%d",type); sprintf(dataS,"%d",data); strcat(msg,";"); strcat(msg,dataS); strcat(msg,";"); strcat(msg,nomFileRep); mqd_t fdq = mq_open(NOM_FILE,O_WRONLY); if(fdq == -1){ perror("mq_open"); exit(EXIT_FAILURE); } struct mq_attr attr; attr.mq_maxmsg = 6; attr.mq_msgsize = sizeof(char)*258; mqd_t fdr = mq_open(nomFileRep,O_RDONLY|O_CREAT,S_IRUSR|S_IWUSR,&attr); if(fdr == -1){ perror("mq_open"); exit(EXIT_FAILURE); } mq_send(fdq,msg,attr.mq_msgsize,(int)NULL); char buf[254]; while(mq_receive(fdr,buf,sizeof(buf),NULL) != -1){ printf("On entre dans le while"); printf("%s",buf); } exit(EXIT_SUCCESS); }
Merci d'avance pour votre aide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <pwd.h> #include <fcntl.h> #include <mqueue.h> #include <string.h> #include <grp.h> #include <sys/stat.h> #define NOM_FILE "/question_f" /**struct question{ int type; int data; char * nomTubeRep; };*/ void traite_question(char * q){ char * rep = "Infos sur l'utilisateur :\n"; int type = atoi(strtok(q,";")); int data = atoi(strtok(NULL,";")); char * nomFileRep = strtok(NULL,";"); int uidPid = 0; switch(type){ case 1 : uidPid = data; struct passwd * pw = getpwuid(uidPid); if(pw == NULL){ perror("getpwuid"); exit(EXIT_FAILURE); } char * login = pw->pw_name; struct group * gr = getgrgid(pw->pw_gid); if(gr == NULL){ perror("getgrgid"); exit(EXIT_FAILURE); } char * groupe = gr->gr_name; char * directory = pw->pw_dir; char * usedShell = pw->pw_shell; strcat(rep,"UID : "); char * uid_s =""; sprintf(uid_s,"%d",uidPid); strcat(rep,uid_s); strcat(rep,"\nLogin : "); strcat(rep,login); strcat(rep,"\nGroupe : "); strcat(rep,groupe); strcat(rep,"\n Répertoire dédié : "); strcat(rep,directory); strcat(rep,"\nShell Utilisé : "); strcat(rep,usedShell); strcat(rep,"\n"); break; case 2 : uidPid = data; break; default : perror("Mauvais type"); } mqd_t fdr = mq_open(nomFileRep,O_WRONLY); if(fdr == -1){ perror("mq_open"); exit(EXIT_FAILURE); } printf("Sa arrive ici"); mq_send(fdr,rep,sizeof(char)*254,(int)NULL); if(mq_close(fdr) == -1){ perror("mq_close"); exit(EXIT_FAILURE); } } int main(){ char * q = ""; struct mq_attr attr;; attr.mq_maxmsg = 6; attr.mq_msgsize = sizeof(char)*64; mqd_t fdq = mq_open(NOM_FILE,O_RDONLY|O_CREAT,S_IRUSR|S_IWUSR,&attr); if(fdq == -1){ perror("mq_open_Quest"); exit(EXIT_FAILURE); } while((mq_receive(fdq,q,attr.mq_msgsize,NULL))!= -1){ traite_question(q); } exit(EXIT_SUCCESS); }
Partager