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 : 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);
}
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
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);
}
Merci d'avance pour votre aide