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

来源:互联网 发布:linux 运维命令 编辑:程序博客网 时间:2024/05/15 05:38

代码备用

#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 32typedef 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