1.一个进程循环打印字符串,另外一个进程循环倒置字符串;
要求打印一次,倒置一次
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, const char *argv[])
{
key_t semkey = ftok("./",0);
if(semkey==EOF){
perror("ftok");
return 0;
}
// 创建共享内存
int shmid=shmget(semkey,100,IPC_CREAT|0777);
char *s;
shmat(shmid,s,0);
bzero(s,100);
strcpy(s,"asdfghjkl");
int semid=semget(semkey,1,IPC_CREAT|0777);
if(EOF==semid){
perror("semget");
return 0;
}
pid_t cpid=fork();
struct sembuf sems;
sems.sem_num=semid;
sems.sem_flg=0;
if(cpid){
int val;
// 显示
while(1){
sems.sem_op=0;
semop(semid,&sems,1);
printf("%s\n",s);
sems.sem_op=2;
semop(semid,&sems,1);
}
}else{
// 倒置
char *lp,*rp;
while(1){
sems.sem_op=-1;
semop(semid,&sems,1);
printf("11111\n");
lp=s;rp=s;
while(*++rp);
rp--;
while(lp<rp){
*lp+=*rp;
*rp=*lp-*rp;
*lp-=*rp;
lp++;
rp--;
}
sems.sem_op=-1;
semop(semid,&sems,1);
}
}
return 0;
}
2. 要求用消息队列实现AB进程对话:
1)A进程发送一句话,B进程接收后打印;
2)B进程接着再发送一句话,A进程接收打印;
3)重复上述步骤,当A进程或者B进程接收到quit后退出AB进程。
在第二题的基础上实现AB进程能够随时收发。
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
struct msgp
{
long mtype;
char mtext[100];
};
int main(int argc, const char *argv[])
{
int msgkey=ftok("./",1);
if(EOF==msgkey){
perror("ftok");
return 0;
}
int msgid=msgget(msgkey,IPC_CREAT|0777);
pid_t cpid=fork();
if(cpid){
// 发送
struct msgp sendp;
sendp.mtype=1; // 另一端发送2包
while(1){
bzero(sendp.mtext,100);
scanf(" %s",sendp.mtext);
if(msgsnd(msgid,&sendp,100,0)){
perror("msgsnd");
return 0;
}
}
}else{
// 接受
struct msgp recvp;
recvp.mtype=2;
while(1){
bzero(recvp.mtext,100);
msgrcv(msgid,&recvp,100,2,0); // 另一端接收1包
printf("B:%s\n",recvp.mtext);
}
}
return 0;
}