Linux进程间的通讯

如下这两篇文章应该解释的很清晰了。

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: 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值