进程间通信:共享内存+读写锁 实现多个进程间同步通信


shm_com.h:

#ifndef _SHMCOM_H_HEADER  
#define _SHMCOM_H_HEADER
#define TEXT_SZ 2048
struct shared_use_st {
  int written;
  char text[TEXT_SZ];
};
#endif

consumer:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <pthread.h>
#include "shm_com.h"
pthread_rwlock_t rwlock;
int main(){
    int shmid;
    srand((unsigned int)getpid());
    shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);
    if (shmid == -1) {
      fprintf(stderr, "shmget failed\n");
      exit(EXIT_FAILURE);
    }
    void *shared_memory = (void *)0;
    shared_memory = shmat(shmid, (void *)0, 0);
    if (shared_memory == (void *)-1) {
      fprintf(stderr, "shmat failed\n");
      exit(EXIT_FAILURE);
    }
    printf("Memory attached at %X\n", (long)shared_memory);
    struct shared_use_st *shared_stuff;
    shared_stuff = (struct shared_use_st *)shared_memory;
    shared_stuff->written = 0;
    int running = 1;
    while(running){
      if (shared_stuff->written){
        pthread_rwlock_wrlock(&rwlock);
        printf("You wrote: %s", shared_stuff->text);
        sleep( rand() % 4 );
        shared_stuff->written = 0;
        pthread_rwlock_unlock(&rwlock);
        if (strncmp(shared_stuff->text, "end", 3) == 0) {
        running = 0;
        }
       }
    }
    if (shmdt(shared_memory) == -1){
        fprintf(stderr, "shmdt failed\n");
        exit(EXIT_FAILURE);
    }
    if (shmctl(shmid, IPC_RMID, 0) == -1){
        fprintf(stderr, "shmctl(IPC_RMID) failed\n");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}

producer:

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <pthread.h>
#include "shm_com.h"
pthread_rwlock_t rwlock;
int main(){
    int shmid;
    shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);
    if (shmid == -1){
        fprintf(stderr, "shmget failed\n");
        exit(EXIT_FAILURE);
    }
    void *shared_memory = (void *)0;
    shared_memory = shmat(shmid, (void *)0, 0);
    if (shared_memory == (void *)-1){
        fprintf(stderr, "shmat failed\n");
        exit(EXIT_FAILURE);
    }
    printf("Memory attached at %X\n", (long)shared_memory);
    struct shared_use_st *shared_stuff;
    shared_stuff = (struct shared_use_st *)shared_memory;
    int running = 1;
    char buffer[BUFSIZ];
    while(running){
        while(shared_stuff->written == 1){
            sleep(1);
            printf("waiting for client...\n");
        }
        pthread_rwlock_wrlock(&rwlock);
        printf("Enter some text: ");
        fgets(buffer, BUFSIZ, stdin);
        strncpy(shared_stuff->text, buffer, TEXT_SZ);
        shared_stuff->written = 1;
        pthread_rwlock_unlock(&rwlock);
        if (strncmp(buffer, "end", 3) == 0) {
            running = 0;
        }
    }
    if (shmdt(shared_memory) == -1) {
        fprintf(stderr, "shmdt failed\n");
        exit(EXIT_FAILURE);
    }
    exit(EXIT_SUCCESS);
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM