Hey, so i'm having some problems with my message passing code.
Ultimately, what i'm trying to do is use the msgget/snd/rcv commands to send the pid of the parent to the child, and visa versa. However, i'm getting an invalid argument error fr my msgsnd in the child process. My code is a bit messy, but here's what I have:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
int main(void)
{
struct msgbuf {
long priority;
int temp;
int pid;
} buf;
int msqid, result;
pid_t pid, myPid;
size_t size = sizeof(buf);
msqid = msgget(2345, 0600|IPC_CREAT); //create message sending
printf("msqid: %d\n", msqid);
pid = fork();
switch (pid) {
case -1:
printf("fork failed");
exit(-1);
case 0:
//msqid = msgget(key, 0600|IPC_CREAT); //create message sending
//printf("%d\n", msqid);
myPid = getpid();
buf.pid = myPid;
printf("pid child/sender:%d\n... Sending\n", buf.pid);
result = msgsnd(msqid, &buf, sizeof(buf)-sizeof(long), 0); //Send process id
if (result==-1) {
perror("msgsnd:");
exit(-1);
}
//printf("%d\n",result);
//wait(NULL); //wait for child to finish sending pid back
result = msgrcv(msqid, &buf, sizeof(buf)-sizeof(long), 2, 0);
if (result==-1) {
perror("msgrcv:");
exit(-1);
}
printf("Received reply from: %d\n", buf.pid);
exit(0);
default:
//wait(NULL);
//msqid = msgget(key, 0666|IPC_CREAT); //create message sending
//printf("%d\n", msqid);
printf("pid parent/receiver: %d\n... Receiving\n", getpid());
msgrcv(msqid, &buf, sizeof(buf)-sizeof(long), 2, 0);
printf("Serving for sender: %d\n", buf.pid);
buf.pid = getpid();
msgsnd(msqid, &buf, sizeof(buf)-sizeof(long), 0); //Send process id
}
//struct msqid_ds dummyParam;
msgctl(msqid, IPC_RMID, 0);
exit(0);
}
Any idea on what's going on? My output is:
msqid: 65536
pid parent/receiver: 1200
... Receiving
pid child/sender:1203
... Sending
msgsnd:: Invalid argument
Serving for sender: 0
I was outputting the msqid to make sure that the child and parent were connected to the same memory