Ich versuche, fork() zu implementieren, um eine Nachrichtenwarteschlange zu implementieren. Hier ist, was ich habe.Verwendung von fork() falsch?
#define DATA_SIZE 256
#define BUFF_SIZE 4096
int main(void) {
// seed the random number generator
srand(time(NULL));
// Parent and Ground Truth Buffers
char ground_truth[BUFF_SIZE] = {0}; // used to verify
char producer_buffer[BUFF_SIZE] = {0}; // used by the parent
int i = 0;
int msqid = 0;
int rc;
pid_t msq_pid;
for (i = 0; i < BUFF_SIZE; ++i) {
producer_buffer[i] = ground_truth[i] = rand() % 256;
}
const key_t s_msq_key = 1337; // used to create message queue ipc
const char *const p_msq_key = "/OS_MSG";
msqid = msgget(s_msq_key, IPC_CREAT | 0660);
msq_pid = fork();
if(msq_pid == -1){
perror("error forking");
exit(1);
}
if(msq_pid > 0){
rc = msgsnd(msqid, (void*)p_msq_key, sizeof(producer_buffer), 0);
printf("MESSAGE SENT\n");
if(rc < 0){
perror("message send failed");
exit(1);
}
return 1;
} else {
if(memcmp(producer_buffer, ground_truth, DATA_SIZE) == 0){
printf("MESSAGE REC");
return 1;
}
exit(1);
}
return 0;
}
Ich fügte mein tatsächliches Problem hinzu. Hoffentlich ist das nicht zu viel. Dies ist eine Hausaufgabe, aber ich wollte nicht nur Hilfe mit dem Code bekommen. Wieder einmal das einzige Ergebnis, das ich erhalte MESSAGE REC
anstatt MESSAGE SENT
gefolgt von MESSAGE REC
EDIT:
Okay, Ich habe eine Fehlerprüfung für msq_pid == -1
. Ich bemerkte auch, dass ich, als ich meine virtuelle Maschine neu startete, sowohl MESSAGE SENT
als auch MESSAGE REC
bekommen konnte. Nach mehreren weiteren Durchläufen des Programms begann ich dann nur, MESSAGE REC
zu empfangen. Kann jemand das erklären?
Post ein kurzes aber komplettes Programm, das wir kompilieren können, demonstriert das Problem. –
Wenn dieser Code in 'main' ist, sollte es funktionieren (obwohl Sie' \ n' am Ende des ersten 'printf' haben sollten). Wenn Sie es in ein Unterprogramm verschoben haben, haben Sie nicht genügend Code gezeigt. – user3386109
Ich habe das Problem bearbeitet, um alle meine Logik einzuschließen. –