每个应用一个队列
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/msg.h>
#include<fcntl.h>
#include<limits.h>
#include<errno.h>
#include<string.h>
#define MQ_KEY1 1231L
#define MQ_KEY2 2340L
#define MAXMESGDATA (PIPE_BUF - 2*sizeof(long))
struct mymesg
{
long mesg_len;
long mesg_type;
char mesg_data[MAXMESGDATA];
};
#define MESGHDRSIZE (sizeof(struct mymesg) - MAXMESGDATA)
void server(int, int);
ssize_t mesg_send(int, struct mymesg*);
ssize_t mesg_recv(int, struct mymesg*);
int main(int argc, char **argv)
{
int msqid;
msqid = msgget(MQ_KEY1, 0666 | IPC_CREAT);
server(msqid, msqid);
exit(0);
}
ssize_t mesg_send(int id, struct mymesg *mptr)
{
return msgsnd(id, &(mptr->mesg_type), mptr->mesg_len, 0);
}
ssize_t mesg_recv(int id, struct mymesg *mptr)
{
ssize_t n;
n = msgrcv(id, &(mptr->mesg_type), MAXMESGDATA, mptr->mesg_type, 0);
return n;
}
void server(int readfd, int writefd)
{
struct mymesg mesg;
size_t len;
ssize_t n;
char *ptr;
unsigned long pid;
FILE *fp;
while(1)
{
mesg.mesg_type = 1;
if((n = mesg_recv(readfd, &mesg)) == 0)
continue;
printf("%s\n", mesg.mesg_data);
if((ptr = strchr(mesg.mesg_data, ' ')) == NULL)
continue;
mesg.mesg_data[n] = '\0';
*ptr++ = 0;
pid = atol(mesg.mesg_data);
mesg.mesg_type = pid;
if((fp = fopen(ptr, "r")) == NULL)
{
printf("fopen failed\n");
snprintf(mesg.mesg_data+n, sizeof(mesg.mesg_data)-n, ":can't open %s\n", strerror(errno));
mesg.mesg_len = strlen(mesg.mesg_data);
mesg_send(writefd, &mesg);
}
else
{
while(fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL)
{
mesg.mesg_len = strlen(mesg.mesg_data);
mesg_send(writefd, &mesg);
}
fclose(fp);
}
}
mesg.mesg_len = 0;
mesg_send(writefd, &mesg);
}
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/msg.h>
#include<fcntl.h>
#include<limits.h>
#include<errno.h>
#include<string.h>
#define MQ_KEY1 1231L
#define MQ_KEY2 2340L
#define MAXMESGDATA (PIPE_BUF - 2*sizeof(long))
struct mymesg
{
long mesg_len;
long mesg_type;
char mesg_data[MAXMESGDATA];
};
#define MESGHDRSIZE (sizeof(struct mymesg) - MAXMESGDATA)
void client(int, int);
ssize_t mesg_send(int, struct mymesg*);
ssize_t mesg_recv(int, struct mymesg*);
int main(int argc, char **argv)
{
int msqid;
msqid = msgget(MQ_KEY1, 0);
client(msqid, msqid);
exit(0);
}
ssize_t mesg_send(int id, struct mymesg *mptr)
{
return msgsnd(id, &(mptr->mesg_type), mptr->mesg_len, 0);
}
ssize_t mesg_recv(int id, struct mymesg *mptr)
{
ssize_t n;
n = msgrcv(id, &(mptr->mesg_type), MAXMESGDATA, mptr->mesg_type, 0);
return n;
}
void client(int readfd, int writefd)
{
struct mymesg mesg;
pid_t pid;
size_t len;
ssize_t n;
pid = getpid();
snprintf(mesg.mesg_data, MAXMESGDATA, "%ld ", (long)pid);
len = strlen(mesg.mesg_data);
fgets(mesg.mesg_data+len, sizeof(mesg.mesg_data)-len, stdin);
printf("%s\n", mesg.mesg_data);
len = strlen(mesg.mesg_data);
if(mesg.mesg_data[len-1] == '\n')
len--;
mesg.mesg_len = len;
mesg.mesg_type = 1;
mesg_send(writefd, &mesg);
mesg.mesg_type = (long)pid;
while((n = mesg_recv(readfd, &mesg)) >0)
write(STDOUT_FILENO, mesg.mesg_data, n);
}
每个客户一个队列
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/msg.h>
#include<string.h>
#include<errno.h>
#include<limits.h>
#include<signal.h>
#define MAXMESGDATA (PIPE_BUF - 2*sizeof(long))
#define SERVER_KEY 1234L/*服务器消息队列,众所周知的键*/
struct mymesg
{
long mesg_len;
long mesg_type;
char mesg_data[MAXMESGDATA];
};
#define MESGHDRSIZE (sizeof(struct mymesg) - MAXMESGDATA)
ssize_t mesg_send(int, struct mymesg*);
ssize_t mesg_rcv(int, struct mymesg*);
void client(int, int);
void sig_chld(int);
int main(int argc, char **argv)
{
int readid, writeid;
struct mymesg mesg;
size_t len;
ssize_t n;
pid_t pid;
char *ptr;
FILE *fp;
signal(SIGCHLD, sig_chld);
readid = msgget(SERVER_KEY, IPC_CREAT | IPC_EXCL | 0666);
while(1)
{
if((n = mesg_rcv(readid, &mesg)) == 0)
continue;
if((pid = fork()) < 0)
{
fprintf(stderr, "fork failed\n");
exit(EXIT_FAILURE);
}
else if(pid == 0)
{
mesg.mesg_data[n] = '\0';
if((ptr = strchr(mesg.mesg_data, ' ')) == NULL)
exit(EXIT_FAILURE);
*ptr++ = 0;
writeid = atol(mesg.mesg_data);
mesg.mesg_type = 1;
if((fp = fopen(ptr, "r")) == NULL)
{
snprintf(mesg.mesg_data+n, MAXMESGDATA-n, ":can't open %s\n", strerror(errno));
mesg.mesg_len = strlen(mesg.mesg_data);
mesg_send(writeid, &mesg);
}
else
{
while(fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL)
{
mesg.mesg_len = strlen(mesg.mesg_data);
mesg_send(writeid, &mesg);
}
fclose(fp);
}
mesg.mesg_len = 0;
mesg_send(writeid, &mesg);
exit(EXIT_SUCCESS);
}
}
}
ssize_t mesg_send(int fd, struct mymesg *mesg)
{
return msgsnd(fd, &(mesg->mesg_type), mesg->mesg_len, 0);
}
ssize_t mesg_rcv(int fd, struct mymesg *mesg)
{
ssize_t n;
n = msgrcv(fd, &(mesg->mesg_type), MAXMESGDATA,mesg->mesg_type, 0);
mesg->mesg_len = n;
return n;
}
void sig_chld(int signo)
{
pid_t pid;
int stat;
while((pid = waitpid(-1, &stat,WNOHANG)) > 0);
return;
}
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<sys/msg.h>
#include<string.h>
#include<errno.h>
#include<limits.h>
#define MAXMESGDATA (PIPE_BUF - 2*sizeof(long))
#define SERVER_KEY 1234L/*服务器消息队列,众所周知的键*/
struct mymesg
{
long mesg_len;
long mesg_type;
char mesg_data[MAXMESGDATA];
};
#define MESGHDRSIZE (sizeof(struct mymesg) - MAXMESGDATA)
ssize_t mesg_send(int, struct mymesg*);
ssize_t mesg_rcv(int, struct mymesg*);
void client(int, int);
int main(int argc, char **argv)
{
int readid, writeid;
writeid = msgget(SERVER_KEY, 0);
readid = msgget(IPC_PRIVATE, IPC_CREAT | IPC_EXCL | 0666);
client(readid, writeid);
exit(0);
}
ssize_t mesg_send(int fd, struct mymesg *mesg)
{
return msgsnd(fd, &(mesg->mesg_type), mesg->mesg_len, 0);
}
ssize_t mesg_rcv(int fd, struct mymesg *mesg)
{
ssize_t n;
n = msgrcv(fd, &(mesg->mesg_type), MAXMESGDATA,mesg->mesg_type, 0);
mesg->mesg_len = n;
return n;
}
void client(int readfd, int writefd)
{
struct mymesg mesg;
ssize_t n;
size_t len;
mesg.mesg_type = 1;
snprintf(mesg.mesg_data, MAXMESGDATA, "%d ", readfd);
len = strlen(mesg.mesg_data);
fgets(mesg.mesg_data+len, MAXMESGDATA-n, stdin);
len = strlen(mesg.mesg_data);
if(mesg.mesg_data[len-1] == '\n')
len--;
mesg.mesg_len = len;
mesg_send(writefd, &mesg);
mesg.mesg_type = 0;
while((n = mesg_rcv(readfd, &mesg)) > 0)
write(STDOUT_FILENO, mesg.mesg_data, n);
}