1.要求在共享空间存入字符串1234567,a进程循环打印,b进程倒置字符串,不允许出现乱序
#include
#include
int main(int argc, const char *argv[])
{
key_t key=ftok("./",1);
if(key<0)
{
ERR_MSG("ftok");
return -1;
}
int shmid=shmget(key,20,IPC_CREAT|0664);
if(shmid<0)
{
ERR_MSG("shmget");
return -1;
}
void* addr = shmat(shmid,NULL,0);
if((void *)-1==addr)
{
ERR_MSG("shmat");
return -1;
}
char a[]="1234567";
char *p=(char *)addr;
strcpy(p,a);
int *flag=((int *)((char *)addr+7));
*flag=0;
pid_t f=fork();
if(f<0)
{
ERR_MSG("fork");
return -1;
}
if(f>0)
{
while(1)
{
if(0==(*flag))
{
printf("%s\n",(char *)addr);
*flag=1;
}
}
}
if(0==f)
{
char *q=(char *)addr;
int len=strlen(a)-1;
while(1)
{
if(1==(*flag))
{
for(int i=0;i
使用消息队列实现AB进程对话,实现随时收发,输入quit实现停止对话
1
#include
#include
struct msgbuf
{
long mtype;
char mtext[128];
};
int main(int argc, const char *argv[])
{
key_t key=ftok("./",1);
if(key<0)
{
ERR_MSG("ftok");
return -1;
}
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid<0)
{
ERR_MSG("msgget");
return -1;
}
struct msgbuf a;
pid_t fd=fork();
if(fd<0)
{
ERR_MSG("fork");
return -1;
}
if(fd>0)
{
while(1)
{
a.mtype=2;
scanf("%s",a.mtext);
if(msgsnd(msqid,&a,sizeof(a.mtext),0)<0)
{
ERR_MSG("msgsnd");
return -1;
}
if(0==strcmp(a.mtext,"quit"))
{
break;
}
}
}
if(0==fd)
{
ssize_t res;
while(1)
{
res=msgrcv(msqid,&a,sizeof(a.mtext),1,0);
if(res<0)
{
return -1;
}
if(0==strcmp(a.mtext,"quit"))
{
break;
}
printf("%s\n",a.mtext);
}
kill(getppid(),2);
}
return 0;
}
2.
#include
#include
struct msgbuf
{
long mtype;
char mtext[128];
};
int main(int argc, const char *argv[])
{
key_t key=ftok("./",1);
if(key<0)
{
ERR_MSG("ftok");
return -1;
}
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid<0)
{
ERR_MSG("msgget");
return -1;
}
struct msgbuf a;
pid_t fd=fork();
if(fd<0)
{
ERR_MSG("fork");
return -1;
}
if(fd>0)
{
while(1)
{
a.mtype=1;
scanf("%s",a.mtext);
if(msgsnd(msqid,&a,sizeof(a.mtext),0)<0)
{
ERR_MSG("msgsnd");
return -1;
}
if(0==strcmp(a.mtext,"quit"))
{
break;
}
}
}
if(0==fd)
{
ssize_t res;
while(1)
{
res=msgrcv(msqid,&a,sizeof(a.mtext),2,0);
if(res<0)
{
ERR_MSG("msgrcv");
return -1;
}
if(0==strcmp(a.mtext,"quit"))
{
break;
}
printf("%s\n",a.mtext);
}
kill(getppid(),2);
}
return 0;
}