Kolejki komunikatów - msgsnd/msgrcv i fork().

0

Witam chcę napisać prosty program w którym w procesie np potomnym wysyłm wiadomości na kolejkę komunikatów, a w procesie macierzystym je z tamtąd odbieram.
Napisałem coś takiego:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>


struct msgbuf{
  long type;
  char text[1024];
} my_msg;

    
int main(){
  int mid = mid=msgget(0x1235, 0600 | IPC_CREAT);
  
  if(fork==0) {
    while(1){
	printf("wypelniam dane\n");
      strcpy(my_msg.text, "Text");
      my_msg.type=5;
      printf("wysylam\n");
      msgsnd(mid, &my_msg, strlen(my_msg.text)+1,0);
      printf("wyslalem");
    }
    
  } else {
      while(1) {
	printf("odbieram\n");
	msgrcv(mid,&my_msg, 1024, 5, 0);
	printf("odebralem\n");
	printf("%s \n", my_msg.text);
      }
      
    }
    
  return 0;
}

Czy mógłby mnie ktoś poprawić, wytłumaczyć dlaczego program nie działa tak jakbym tego oczekiwał?

1

Nie wiem po co takie dziwne przypisanie na samym początku:

int mid = mid=msgget(0x1235, 0600 | IPC_CREAT);

Następnie, warto się zastanowić co to robi ;) :

if(fork == 0) ... // tutaj nie ma wywołania funkcji fork
// poprawić na
if(fork() == 0) lub if(!fork())

Jeśli utworzyłeś strukturę wiadomości to warto wysłać ją całą a nie tylko tekst. Twój kod nadpisuje potem pole 'long type' przy odbieraniu wiadomości.

msgsnd(mid, &my_msg, strlen(my_msg.text)+1,0);
// poprawka
msgsnd(mid, &my_msg, sizeof(struct msgbuf),0);

To wszystko sprawi, że twój kod zacznie działać jak należy 8)

pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1