mon code est un processus serveur simultané multiprocessus, il utilise la file d'attente de messages système V pour communiquer avec le processus client, un client avec un processus enfant. premier je veux attendre le processus de l'enfant qui n'est plus utiliser.et quand j'ai défini SIGCHLD gestionnaire avec SIG_IGN, le programme peut fonctionner correctement, mais toujours erreur quand je attrape SIGCHLD, l'erreur est le processus client bloqué dans l'appel système mesrcv, ce qui signifie que le serveur n'envoie pas de message au client. deuxième, le processus du serveur est sorti quand j'ai entré^\ pour quitter mon processus client, je l'ai fait devenir un démon et le faire tourner en backgroud pour toujours, donc je pense que les appels waitpid sont attendent lui-même? il est impossiblepourquoi mon gestionnaire de signal n'attend pas juste un processus enfant?
//this is signal handler
void handler(int sig){
waitpid(-1,NULL,WNOHANG);
}
//in main
//my first step is make it become a daemon(fork twice)
//my first step is using record lock to ensure only one running
//then set signal handler and process message send by client
if(signal(SIGCHLD,SIG_IGN)==SIG_ERR){
//because its a daemon,so no tty and redirct stdin,stdout,stderr to /dev/null
syslog(LOG_ERR|LOG_USER,"set signal handler failed");
return errno;
}
//now process the client request ,client message contant a client sysV message queue id and a filename,server report the file whether exist
int pid;
while((rcv_size=msgrcv(srvmqid,&srvbuf,1024,0)!=-1){
if(0==rcv_size)
continue;
if((pid=fork())<=0){
clibuf.mtype=srvbuf.mtype;
climsqid=strtol(srvbuf.filename,&filename,10);
if((fd=open(filename,O_RDONLY)==-1)
snprintf(clibuf.filename,"file doesn't exist\n");
else{
snprintf(clibuf.filename,"file exist\n");
close(fd);
}
if(msgsnd(climsqid,&clibuf,1024,0)==-1)
syslog(LOG_ERR,"send message to client pid:%d failed,srvbuf.mtype);
if(pid==0) //if pid<0,then no child process is created
exit(0);
}
}
le code de base du processus client sont inférieurs
int main(int argc,char*argv[]){
//first ,i create the client message queue and open public serve message queue,then send struct msgbuf struct to server,the mtype is pid,the buffer behind mtype is composed by client message queue key and filename(no space between them)
while(1){
if(msgsnd(sermsqid,&sndbuf,1024,0)!=-1){
if(msgrcv(climsqid,&rcvbuf,1024,0,0)!=-1)
printf("type:%ld,file state:%s\n",rcvbuf.mtype,rcvbuf.filename);
else
printf("receive message failed\n");
}
printf("input a filename you want to search:(^e to quit)");
fgets(filename,1024,stdin);
if(filename[0]==5)//^e is 5
break;
filename[strlen(filename)-1)='\0';
snprintf(sndbuf.filename,1024,"%d%s",climsqid,filename);
}
msgctl(climsqid,IPC_RMID,NULL);
return errno;
}
'snprintf (clibuf.filename, "fichier n'existe pas \ n");' L'argument de taille manque ici. (votre compilateur devrait au moins générer un avertissement) – wildplasser
désolé, c'est mon erreur d'orthographe. Je veux corriger mais il ne semble pas prendre en charge modification.my client et le programme du serveur peut être compilé avec succès – Peterhaiker
Ne devrait pas compiler. Changez les drapeaux du compilateur. Pour gcc, ajoutez '-Wall -Wpedantic' – wildplasser