0
点赞
收藏
分享

微信扫一扫

使用共享内存实现进程与进程通信

使用共享内存实现进程与进程通信

要求:循环发送(可获取键盘输入,也可内置消息,间隔1s以上),循环接受,不落下任何消息,不输出空消息,不输出重复消息。

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

#include <sys/wait.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#include <string.h>

#include <strings.h>



int main(int argc, char const *argv[])

{

    key_t key = ftok("./", 1);

    int shmid = shmget(key, 256, IPC_CREAT | 0666);

    printf("%d\n", shmid);

    pid_t pid;

    int i = 0;

    for (i = 0; i < 2; i++)

    {

        pid = fork();

        if (pid < 0)

        {

            perror("fork");

            return -1;

        }

        else if (pid == 0)

        {

            break;

        }

    }



    if (i == 2)

    {

        pid_t son_pid;

        while (1)

        {

            son_pid = waitpid(-1, NULL, WNOHANG);

            if (son_pid < 0)

            {

                break;

            }

        }

    }

    else if (i == 1)

    {

        void *str = shmat(shmid, NULL, 0);

        char buf[64] = "";
        



#if 1
        //读共享内存(空不读,重复不读)

        while (1)

        {

            if (strcmp((char *)str, "") == 0)

            {

                continue;

            }

            else if (strcmp((char *)str, buf) == 0)

            {

                continue;

            }

            else

            {

                printf("%s\n", (char *)str);
                

                strcpy(buf, (char *)str);

                if (strstr((char *)str, "9"))

                {

                    shmctl(shmid, IPC_RMID, NULL);

                    break;

                }

            

            }

        }

#endif

    }

    else

    {
        //每隔1s写共享内存

        void *str = shmat(shmid, NULL, 0);

        char buf[64] = "";

        for (int n = 0; n < 10; n++)

        {

            sleep(1);

            bzero((char *)str, 256);

            bzero(buf, sizeof(buf));

            sprintf(buf, "第%d个数据", n);

            strcpy((char *)str, buf);

        }

    }



    return 0;

}

举报

相关推荐

0 条评论