题目一
要求AB进程做通信
1.A进程发送一句话,B进程接收打印
2.然后B进程发送给A进程一句话,A进程接收打印
3.重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;
4.在上面基础上实现,AB进程能够随时收发数据
代码示例
A进程
typedef struct msgbuf{
long mtype;
char mtext[128];
}msgbuf;
int msqid;
//A发送
void* A_SND(void *arg)
{
msgbuf snd = *(msgbuf*)arg;
while(1)
{
//A输入
printf("A进程输入>>>");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1] = '\0';
if(msgsnd(msqid,&snd,sizeof(snd.mtext),0) <0 )
{
perror("msgsnd");
break;
}
printf("A进程消息发送成功\n");
if(strcmp(snd.mtext,"quit")==0)
exit(0);
}
pthread_exit(NULL);
}
//A接收
void* A_RCV(void *arg)
{
msgbuf rcv = *(msgbuf*)arg;
ssize_t res;
while(1)
{
//A接收
res = msgrcv(msqid,&rcv,sizeof(rcv.mtext),2,0);
if(res < 0)
{
perror("msgrcv");
break;
}
printf("\rA收到B进程的消息:%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
exit(0);
printf("A进程输入>>>");
fflush(stdout);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//计算key值
key_t key = ftok("./",1);
if(key < 0)
{
perror("fork");
return -1;
}
//创建一个消息队列
msqid = msgget(key,IPC_CREAT|0664);
if(msqid < 0)
{
perror("msgget");
return -1;
}
msgbuf rcv;
msgbuf snd;
snd.mtype=1;
//创建线程
pthread_t tid1,tid2;
//发送线程
if(pthread_create(&tid1,NULL,A_SND,(void*)&snd) != 0)
{
perror("pthread_create");
return -1;
}
//接收线程
if(pthread_create(&tid2,NULL,A_RCV,(void*)&rcv) != 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
B进程
typedef struct msgbuf{
long mtype;
char mtext[128];
}msgbuf;
int msqid;
//B发送
void* B_SND(void *arg)
{
msgbuf snd = *(msgbuf*)arg;
while(1)
{
//B输入
printf("B进程输入>>>");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1] = '\0';
if(msgsnd(msqid,&snd,sizeof(snd.mtext),0) <0 )
{
perror("msgsnd");
}
printf("B进程消息发送成功\n");
if(strcmp(snd.mtext,"quit")==0)
exit(0);
}
pthread_exit(NULL);
}
//B接收
void* B_RCV(void *arg)
{
msgbuf rcv = *(msgbuf*)arg;
ssize_t res;
while(1)
{
//B接收
res = msgrcv(msqid,&rcv,sizeof(rcv.mtext),1,0);
if(res < 0)
{
perror("msgrcv");
break;
}
printf("\rB收到A进程的消息:%s\n",rcv.mtext);
if(strcmp(rcv.mtext,"quit")==0)
exit(0);
printf("B进程输入>>>");
fflush(stdout);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//计算key值
key_t key = ftok("./",1);
if(key < 0)
{
perror("fork");
return -1;
}
//创建一个消息队列
msqid = msgget(key,IPC_CREAT|0664);
if(msqid < 0)
{
perror("msgget");
return -1;
}
msgbuf snd;
snd.mtype = 2;
msgbuf rcv;
//ssize_t res;
//创建线程
pthread_t tid1,tid2;
//接收线程
if(pthread_create(&tid2,NULL,B_RCV,(void*)&rcv) != 0)
{
perror("pthread_create");
return -1;
}
//发送线程
if(pthread_create(&tid1,NULL,B_SND,(void*)&snd) != 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
测试结果
题目二
- A进程写入一个整型,在该整型后,写入一个字符串
- B进程将共享内存中的整型以及字符串读取出来;
代码示例
A进程
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'a');
if(key < 0)
{
perror("ftok");
return -1;
}
int shmid = shmget(key,32,IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
void* shmaddr = shmat(shmid,NULL,0);
if((void*)-1 == shmaddr)
{
perror("shmat");
return -1;
}
int *pta = (int*)shmaddr;
printf("请输入一个整型>>>");
int a;
scanf("%d",&a);
*pta = a;
printf("请输入一个字符串>>>");
char str[32] = "";
getchar();
fgets(str,sizeof(str),stdin);
str[strlen(str)-1] = '\0';
strcpy((char*)(pta+1),str);
return 0;
}
B进程
int main(int argc, const char *argv[])
{
key_t key = ftok("./",'a');
if(key < 0)
{
perror("ftok");
return -1;
}
int shmid = shmget(key,32,IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
void* shmaddr = shmat(shmid,NULL,0);
if((void*)-1 == shmaddr)
{
perror("shmat");
return -1;
}
int *pta = (int*)shmaddr;
printf("%d\n",*pta);
printf("%s\n",(char*)(pta+1));
return 0;
}