用命名管道分别写一个服务器程序和客户机程序,客户机的的父进程负责每隔一秒产成一个子进程,(形成一个进程扇),而每个子进程则往自己的FIFO中写入自己的PID号码,服务器负责从FIFO中读取数据并打印在屏幕上。
要求:
用open函数处理重复创建问题
使用access函数处理重复创建问题
//客户机实例程序
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <strings.h>
#define S2C 10
#define C2S 20
struct msgbuf{
long mtype; //类型
char mtext[50];//正文
};
void func(int sig)
{
exit(0);
}
int main(int argc,char *argv[])
{
//1. 为消息队列申请key值与ID号
key_t key = ftok(".",10);
int msgid = msgget(key,IPC_CREAT|0666);
//2. 带着这条队列去产生一个小孩
pid_t x;
x = fork();
if(x > 0) //父进程 发送消息
{
signal(SIGCHLD,func);
struct msgbuf gec;
int ret;
while(1)
{
bzero(&gec,sizeof(gec));
gec.mtype = C2S;
fgets(gec.mtext,sizeof(gec.mtext),stdin);
ret = msgsnd(msgid,&gec,strlen(gec.mtext),0);
if(ret == -1)
{
printf("msgsnd error!\n");
}
if(strncmp(gec.mtext,"quit",4) == 0)
{
kill(x,SIGUSR1);
exit(0);
}
}
}
if(x == 0) //子进程 接收消息
{
signal(SIGUSR1,func);
struct msgbuf gec;
int ret;
while(1)
{
bzero(&gec,sizeof(gec));
ret = msgrcv(msgid,&gec,sizeof(gec.mtext),S2C,0);
if(ret == -1)
{
printf("msgrcv error!\n");
}
printf("from server:%s",gec.mtext);
if(strncmp(gec.mtext,"quit",4) == 0)
{
msgctl(msgid,IPC_RMID,NULL); //删除消息队列
exit(0); //子进程 会自动发送SIGCHLD给父进程。
}
}
}
}
//服务器示例程序
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <strings.h>
#define S2C 10
#define C2S 20
struct msgbuf{
long mtype; //类型
char mtext[50];//正文
};
void func(int sig)
{
exit(0);
}
int main(int argc,char *argv[])
{
//1. 为消息队列申请key值与ID号
key_t key = ftok(".",10);
int msgid = msgget(key,IPC_CREAT|0666);
//2. 带着这条队列去产生一个小孩
pid_t x;
x = fork();
if(x > 0) //父进程 发送消息
{
signal(SIGCHLD,func);
struct msgbuf gec;
int ret;
while(1)
{
bzero(&gec,sizeof(gec));
gec.mtype = S2C;
fgets(gec.mtext,sizeof(gec.mtext),stdin);
ret = msgsnd(msgid,&gec,strlen(gec.mtext),0);
if(ret == -1)
{
printf("msgsnd error!\n");
}
if(strncmp(gec.mtext,"quit",4) == 0)
{
kill(x,SIGUSR1);
exit(0);
}
}
}
if(x == 0) //子进程 接收消息
{
signal(SIGUSR1,func);
struct msgbuf gec;
int ret;
while(1)
{
bzero(&gec,sizeof(gec));
ret = msgrcv(msgid,&gec,sizeof(gec.mtext),C2S,0);
if(ret == -1)
{
printf("msgrcv error!\n");
}
printf("from client:%s",gec.mtext);
if(strncmp(gec.mtext,"quit",4) == 0)
{
msgctl(msgid,IPC_RMID,NULL); //删除消息队列
exit(0); //子进程 会自动发送SIGCHLD给父进程。
}
}
}
}