进程间通信之线程使用共享内存

代码备用

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<ctype.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>   //O_RDWR
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/shm.h>
#define BUFZE 32
typedef struct
{
    char alpha;
}array;

pthread_mutex_t counter_clock = PTHREAD_MUTEX_INITIALIZER;

void *athread(void*);
void *bthread(void*);

int main(int ac,char*av[])
{
    pthread_t t1,t2;

    int shm_id;
    array *p_map;
    key_t key;

    key = ftok(".", 0);
    if(-1 == key)
    {
        perror("ftok error");
        exit(1);
    }

    shm_id = shmget(key, BUFZE, IPC_CREAT|0666);
    if(shm_id < 0)
    {
        perror("shmget error...");
        exit(2);
    }
    printf("Successfully created segment:%d\n",shm_id);
    system("ipcs -m");

    p_map = (array*)shmat(shm_id, NULL, 0);
    memset( p_map, '@', BUFZE);


    pthread_create(&t1,NULL,athread,(void*)p_map);
    pthread_create(&t2,NULL,bthread,(void*)p_map);

    pthread_join(t1,NULL);
    pthread_join(t2,NULL);

    if(shmdt(p_map) == -1)
    {
        perror("detach error");
        exit(4);
    }

    /* delete the shared memory */
    shmctl(shm_id, IPC_RMID, 0);
    printf("main exit\n");
    return 0;
}
void *athread(void*f)
{
    int i;
    char temp='A';
    array *p_map=(array *)f;

    printf("A: enter\n");
    for(i=0; i < BUFZE; i++)
    {
        pthread_mutex_lock(&counter_clock);

        printf("A: wrote [%d]:%c\n", i, temp);
        memcpy((void*)&(*(p_map+i)).alpha, &temp, 1);
        temp += 1;

        pthread_mutex_unlock(&counter_clock);
    }
    printf("A: exit\n");
}
void *bthread(void*f)
{
    int fd;
    int i;
    int n;
    char tem;
    array *p_map=(array *)f;
    fd = open("./test.dat", O_RDWR|O_CREAT, 0700);
    if(fd == -1)
    {
        perror("Failed to open/creat the file");
        exit(5);
    }

    printf("B: enter\n");
    for(i = 0;i < BUFZE; i++)
    {
        pthread_mutex_lock(&counter_clock);

        tem = (*(p_map+i)).alpha;
        n = write(fd, &tem, 1);
        if(n == -1)
        {
            perror("Failed in the writing thread");
            exit(6);
        }
        printf("B: read [%d]:%c\n", i, tem);

        pthread_mutex_unlock(&counter_clock);
    }
    printf("B: exit\n");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilonglucky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值