2017-03-06 1 views
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)를 가지고 있습니다. 왜 작동하지 않는지는 알 수 없습니다. 나는 많은 예를 보았고 나를 위해 논리가 그렇게 보인다. 무엇이 문제인가? 이 코드에 도움

답변

0

한 오류에 대한

감사는 각 프로세스가 자신의 개인 IPC 큐를 생성한다는 것이다. 그것을 통해 의사 소통을 할 수 있도록

는 그들이 같은 큐를 공유하십시오 :

//spawning two child processes 
int qid = msgget(IPC_PRIVATE, IPC_EXCL|IPC_CREAT|0600); 
pid_t cpid = fork(); 
관련 문제