我正在学习 IPCS,我尝试将消息从客户端发送到服务器,服务器将其乘以 2,然后使用 、 、 和 将其发送ftok
回msgget
客户端。这是我的代码:msgrcv
msgsnd
msgctl
ex1.h
#ifndef EX1_H
#define EX1_H
#define ID 2
#define PATH "./client.c"
struct msgbuf{
long mtype;
int mvalue;
} message, retour;
key_t cle;
int mes_id;
#endif
服务器.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "ex1.h"
int main (int argc, char **argv){
if((cle=ftok(PATH,ID)) == (key_t)-1){
perror("Erreur lors de la création de la clé ");
exit(EXIT_FAILURE);
}
if((mes_id = msgget(cle,IPC_CREAT | 0660 | IPC_EXCL)) == -1){
perror("Erreur dans la création de la file de message ");
exit(EXIT_FAILURE);
}
message.mtype = 1;
if((msgrcv(mes_id, &message, sizeof(message), 1, 0)) == -1){
perror("Erreur lors de la récéption du message ");
exit(EXIT_FAILURE);
}
printf("Je suis le serveur et j'ai reçu %d.\n",message.mvalue);
printf("J'effectue ma multiplication par 2 et renvoie le résultat.\n");
retour.mtype = 3;
retour.mvalue = message.mvalue * 2;
if((msgsnd(mes_id, &retour, sizeof(retour), 0)) == -1){
perror("Erreur lors de l'envoi du résultat ");
exit(EXIT_FAILURE);
}
sleep(1);
msgctl(mes_id,IPC_RMID, NULL);
return EXIT_SUCCESS;
}
客户端.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "ex1.h"
#include <unistd.h>
int main (int argc, char **argv){
if((cle=ftok(PATH, ID)) == (key_t)-1){
perror("Erreur lors de la création de la clé ");
exit(EXIT_FAILURE);
}
if((mes_id = msgget(cle, 0660 | IPC_EXCL)) == -1){
perror("Erreur lors de la récupération du numéro de la file ");
exit(EXIT_FAILURE);
}
message.mtype = 1;
message.mvalue = 4;
if((msgsnd(mes_id, &message, sizeof(message), 0)) == -1){
perror("Erreur lors de l'envoi du message ");
exit(EXIT_FAILURE);
}
retour.mtype = 3;
sleep(2);
if((msgrcv(mes_id, &retour, sizeof(retour), 3, 0)) == -1){
perror("Erreur lors de la récéption du résultat ");
exit(EXIT_FAILURE);
}
printf("Je suis le client et j'ai reçu %d\n", retour.mvalue);
return EXIT_SUCCESS;
}
由于第 23/24 行,我得到Invalid argument
或Identifier removed
错误,但我不明白这里有什么问题。