c語言 共享內存 pthread_cond init... server client 互斥鎖

client

#include<sys/shm.h>  
#include<sys/ipc.h>  
#include<stdio.h>  
#include<stdlib.h>  
#include<unistd.h>  
#include<signal.h>  
#include<sys/types.h>  
#include<sys/stat.h>  
#include<string.h>  
#include<errno.h>  
#include<pthread.h>  

struct Msg {
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    char buff[100];
};

struct Msg *share_memory = NULL;

int main() {
    int shmid;
    char buf[50];
    pid_t pid = getpid();
    key_t key = ftok(".", 198);

    if ((shmid = shmget(key, sizeof(struct Msg), IPC_CREAT | 0666)) < 0) {
        perror("shmget");
        return 1;
    }

    if ((share_memory = (struct Msg *)shmat(shmid, NULL, 0)) < 0) {
        perror("shmat");
        return 1;                    
    }

    while (1) {
        printf("1 start\n");
        pthread_mutex_lock(&share_memory->mutex);
        printf("<1>:");
        scanf("%[^\n]s", share_memory->buff);
        getchar();
        pthread_cond_signal(&share_memory->cond);
        pthread_mutex_unlock(&share_memory->mutex);
        sleep(1);
    }

    return 0;
}

server

#include<sys/shm.h>  
#include<sys/ipc.h>  
#include<stdio.h>  
#include<stdlib.h>  
#include<unistd.h>  
#include<signal.h>  
#include<sys/types.h>  
#include<sys/stat.h>  
#include<string.h>  
#include<errno.h>  
#include<pthread.h>  

struct Msg {
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    char buff[100];
};


struct Msg *share_memory = NULL;


void print() {
    printf("<2>:%s\n", share_memory->buff);
}

int main() {
    int shmid;
    key_t key = ftok(".", 198);
    

    if ((shmid = shmget(key, sizeof(struct Msg), IPC_CREAT | 0666)) < 0) {
        perror("shmget");
        return 1;
    }
     
    if ((share_memory = (struct Msg *)shmat(shmid, NULL, 0)) < 0) {
        perror("");
        return 1;                    
    }
   
    memset(share_memory, 0, sizeof(struct Msg));
    
    pthread_condattr_t c_attr;
    pthread_mutexattr_t m_attr;

    pthread_mutexattr_init(&m_attr);
    pthread_condattr_init(&c_attr);
    
    pthread_mutexattr_setpshared(&m_attr, PTHREAD_PROCESS_SHARED);
    pthread_condattr_setpshared(&c_attr, PTHREAD_PROCESS_SHARED);
    
    pthread_mutex_init(&share_memory->mutex, &m_attr);
    pthread_cond_init(&share_memory->cond, &c_attr);

    while (1) {
        pthread_mutex_lock(&share_memory->mutex);
        printf("2 wait\n");
        pthread_cond_wait(&share_memory->cond, &share_memory->mutex);
        printf("2 work\n");
        printf("<recv> : %s\n", share_memory->buff);
        pthread_mutex_unlock(&share_memory->mutex);
        printf("2 end\n");
    }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章