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;
}