0
두 개의 프로세스를 C++로 통신하려하지만 작동하지 않습니다.C++ - msgsnd & msgrcv가 통신하지 않는 것 같습니다.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
void sender(int qid)
{
// declare my message buffer
struct buf {
long mtype; // required
char greeting[50]; // mesg content
};
buf msg;
int size = sizeof(msg)-sizeof(long);
std::cout << "Type [exit] to stop the program." << std::endl;
bool exit = false;
while (!exit)
{
std::cout << getpid() << ": ";
std::cin.getline(msg.greeting, 50, '\n');
//std::cout << msg.greeting << std::endl;
msg.mtype = 23;
if (strcmp(msg.greeting, "exit") == 0)
exit = true;
msgsnd(qid, (struct msgbuf *)&msg, size, 0);
}
}
void receiver(int qid)
{
// declare my message buffer
struct buf {
long mtype;
char greeting[50];
};
buf msg;
int size = sizeof(msg)-sizeof(long);
bool exit = false;
while (!exit)
{
msgrcv(qid, (struct msgbuf *)&msg, size, 23, 0);
if (strcmp(msg.greeting, "exit") == 0)
exit = true;
std::cout << getpid() << ": " << msg.greeting << std::endl;
}
}
int main(int ac, char **av) {
//spawning two child processes
pid_t cpid = fork();
int qid = msgget(IPC_PRIVATE, IPC_EXCL|IPC_CREAT|0600);
if (cpid == 0) {
// execv("./sender", av);
sender(qid);
exit(0);
}
cpid = fork();
if (cpid == 0) {
//execv("./receiver", av);
receiver(qid);
exit(0);
}
while (wait(NULL) != -1); // waiting for both children to terminate
msgctl(qid, IPC_RMID, NULL);
std::cout << "END" << std::endl;
exit(0);
}
그래서 당신이 볼 수 있듯이, sender()
사용자의 입력을 기다립니다 :이 코드가 있습니다. receiver()
이 대기 중이므로 모든 것이 정상입니다. 그러나 사용자가 입력을 마쳤 으면 [Enter]를 누르지 만 수신자는 아무 것도 얻지 못합니다.
그들은 동일한 QID, 동일한 크기의 msg, 동일한 ID (23)를 가지고 있습니다. 왜 작동하지 않는지는 알 수 없습니다. 나는 많은 예를 보았고 나를 위해 논리가 그렇게 보인다. 무엇이 문제인가? 이 코드에 도움