如下这两篇文章应该解释的很清晰了。
https://blog.csdn.net/ljianhui/article/details/10287879
https://blog.csdn.net/guoping16/article/details/6584024
自己根据以上的理解,测试的代码如下:
MsgTask1接收其他两个线程传过来的message,Msg type分别是1,2.
MsgTask2和MsgTask3发送信息给MsgTask1,Msg type分别是1,2.
MsgTask1的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
struct my_msg_st
{
long int my_msg_type;
char some_text[BUFSIZ];
};
int main(void)
{
int running = 1;
int msgid;
int msgid2;
struct my_msg_st some_data;
long int msg_to_receive = 0;
msgid = msgget((key_t)1234,0666|IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr,"msgget failed with error 1: %d\n", errno);
exit(EXIT_FAILURE);
}
while(1)
{
msg_to_receive = 1;
//if(msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0) == -1)//Blocking mode
if(msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, IPC_NOWAIT) == -1)//Noneblocking mode
{
}
else
{
printf("1 You wrote: %s", some_data.some_text);
}
msg_to_receive = 2;
if(msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, IPC_NOWAIT) == -1)//Noneblocking mode
{
}
else
{
printf("2 You wrote: %s", some_data.some_text);
}
}
if(msgctl(msgid, IPC_RMID, 0)==-1)
{
fprintf(stderr, "msgctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
return 0;
}
MsgTask2的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct my_msg_st
{
long int my_msg_type;
char some_text[MAX_TEXT];
};
int main()
{
int running = 1;
struct my_msg_st some_data;
int msgid;
char buffer[BUFSIZ];
msgid = msgget((key_t)1234,0666|IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr,"msgget failed with error 1: %d\n", errno);
exit(EXIT_FAILURE);
}
while(running)
{
printf("Enter some text: ");
fgets(buffer, BUFSIZ, stdin);
some_data.my_msg_type = 1;
strcpy(some_data.some_text, buffer);
if(msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0)==-1)
{
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
if(strncmp(buffer, "end", 3) == 0)
{
running = 0;
}
}
exit(EXIT_SUCCESS);
}
MsgTask3的代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct my_msg_st
{
long int my_msg_type;
char some_text[MAX_TEXT];
};
int main()
{
int running = 1;
struct my_msg_st some_data;
int msgid;
char buffer[BUFSIZ];
msgid = msgget((key_t)1234,0666|IPC_CREAT);
if(msgid == -1)
{
fprintf(stderr,"msgget failed with error 1: %d\n", errno);
exit(EXIT_FAILURE);
}
while(running)
{
printf("Enter some text: ");
fgets(buffer, BUFSIZ, stdin);
some_data.my_msg_type = 2;
strcpy(some_data.some_text, buffer);
if(msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0)==-1)
{
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
if(strncmp(buffer, "end", 3) == 0)
{
running = 0;
}
}
exit(EXIT_SUCCESS);
}
运行结果如下:
ubuntu@ubuntu:~/Desktop/Example/Msg$ ./MegTask1
1 You wrote: hello
2 You wrote: hello
2 You wrote: hello
2 You wrote: hello
1 You wrote: hello
-----------------------------------------------------------
ubuntu@ubuntu:~/Desktop/Example/Msg$ ./MegTask2
Enter some text: hello
Enter some text: hello
Enter some text:
-----------------------------------------------------------
ubuntu@ubuntu:~/Desktop/Example/Msg$ ./MegTask3
Enter some text: hello
Enter some text: hello
Enter some text: hello
Enter some text: