通过在终端,外部输入两个对话方,实现双向通信
typedef struct msq{
long msgtyp;
char text[255];
}msg_t;
pthread_t pid;
void* func(void* arg){
long S=*(long*)arg;
key_t key=ftok("./msg.txt",S);
if(key==-1){
perror("ftok");
return NULL;
}
int id=msgget(key,IPC_CREAT|0666);
if(id==-1){
perror("msgget");
return NULL;
}
msg_t buf;
while(1){
memset(&buf,0,sizeof(msg_t));
msgrcv(id,&buf,255,S,0);
printf("\033[11D%ldsay:%s\n",S,buf.text);
}
}
int main(int argc, const char *argv[])
{
long s=(long)atoi(argv[1]);
long S=(long)atoi(argv[2]);
key_t key=ftok("./msg.txt",s);
if(key==-1){
perror("ftok");
return -1;
}
int id=msgget(key,IPC_CREAT|0666);
if(id==-1){
perror("msgget");
return -1;
}
pthread_create(&pid,NULL,func,&S);
pthread_detach(pid);
msg_t buf;
while(1){
memset(&buf,0,sizeof(msg_t));
buf.msgtyp=s;
printf("%ld#talk: ",s);
scanf("%s",buf.text);
int len=sizeof(buf.text);
msgsnd(id,&buf,len,0);
//perror("msgsnd");
}
return 0;
}
共享内存+信号集 实现双端通信
//进程1
typedef struct shmbuf{
char text[255];
}shm_t;
pthread_t pid;
void semwait(int sid,int index){
struct sembuf buf;
buf.sem_num=index;
buf.sem_op=-1;
buf.sem_flg=SEM_UNDO;
semop(sid,&buf,1);
}void sempost(int sid,int index){
struct sembuf buf;
buf.sem_num=index;
buf.sem_op=1;
buf.sem_flg=SEM_UNDO;
semop(sid,&buf,1);
}
void* func(void* arg){
int sid=*(int*)arg;
key_t key3=ftok("./shm.txt",3);
if(key3==-1){
perror("ftok");
return NULL;
}
int id=shmget(key3,255,IPC_CREAT|0666);
if(id==-1){
perror("shmget");
return NULL;
}
shm_t* buf=shmat(id,NULL,0);
while(1){
semwait(sid,1);
printf("\033[11D#2say: %s\n",buf->text);
memset(buf,0,sizeof(buf));
sleep(1);
sempost(sid,1);
}
}
int main(int argc, const char *argv[])
{
key_t key=ftok("./shm.txt",1);
if(key==-1){
perror("ftok");
return -1;
}
int id=shmget(key,255,IPC_CREAT|0666);
if(id==-1){
perror("shmget");
return -1;
}
//
key_t key2=ftok("./shm.txt",2);
if(key2==-1){
perror("ftok2");
return -1;
}
int sid=semget(key2,2,IPC_CREAT|0666);
if(sid==-1){
perror("semget");
return -1;
}
semctl(sid,0,SETVAL,1);
semctl(sid,1,SETVAL,1);
//
if(pthread_create(&pid,NULL,func,&sid)!=0){
perror("pthread_create");
return -1;
}
pthread_detach(pid);
shm_t* buf=shmat(id,NULL,0);
while(1){
semwait(sid,0);
printf("1#talk: ");
scanf("%s",buf->text);
sempost(sid,0);
}
return 0;
}
//进程2
typedef struct shmbuf{
char text[255];
}shm_t;
pthread_t pid;
void semwait(int sid,int index){
struct sembuf buf;
buf.sem_num=index;
buf.sem_op=-1;
buf.sem_flg=SEM_UNDO;
semop(sid,&buf,1);
}void sempost(int sid,int index){
struct sembuf buf;
buf.sem_num=index;
buf.sem_op=1;
buf.sem_flg=SEM_UNDO;
semop(sid,&buf,1);
}
void* func(void* arg){
int sid=*(int*)arg;
key_t key=ftok("./shm.txt",1);
if(key==-1){
perror("ftok");
return NULL;
}
int id=shmget(key,255,IPC_CREAT|0666);
if(id==-1){
perror("shmget");
return NULL;
}
shm_t* buf=shmat(id,NULL,0);
while(1){
semwait(sid,0);
printf("\033[11D#1say: %s\n",buf->text);
memset(buf,0,sizeof(buf));
sleep(1);
sempost(sid,0);
}
}
int main(int argc, const char *argv[])
{
key_t key3=ftok("./shm.txt",3);
if(key3==-1){
perror("ftok");
return -1;
}
int id=shmget(key3,255,IPC_CREAT|0666);
if(id==-1){
perror("shmget");
return -1;
}
//
key_t key2=ftok("./shm.txt",2);
if(key2==-1){
perror("ftok2");
return -1;
}
int sid=semget(key2,2,IPC_CREAT|0666);
if(sid==-1){
perror("semget");
return -1;
}
//semctl(sid,0,SETVAL,1);
//semctl(sid,1,SETVAL,1);
//
if(pthread_create(&pid,NULL,func,&sid)!=0){
perror("pthread_create");
return -1;
}
pthread_detach(pid);
shm_t* buf=shmat(id,NULL,0);
while(1){
semwait(sid,1);
printf("2#talk: ");
scanf("%s",buf->text);
sempost(sid,1);
}
return 0;
}