当前位置: 技术问答>linux和unix
UNIX的C编程问题啦..请大家帮帮忙啦,谢谢
来源: 互联网 发布时间:2015-09-11
本文导语: 有三段简单的小程序,要求修改其中的某些东西,如下 参考que.h,queuesnd.c和queuercv.c,并改写它们,使放入队列的消息是一个已存在文件的内容(假设该文件长度小于que.h中定义的常数MAXOBN,即只需占一个消息)。就是只...
有三段简单的小程序,要求修改其中的某些东西,如下
参考que.h,queuesnd.c和queuercv.c,并改写它们,使放入队列的消息是一个已存在文件的内容(假设该文件长度小于que.h中定义的常数MAXOBN,即只需占一个消息)。就是只要改变输入到队列的信息的方式就行了
程序如下
/* que.h--- header for message IPC */
#include
#include
#include
#include
#include
#define QKEY (key_t)0206 /* 消息队列的标识符 */
#define QPERM 0660 /* 对队列的读写权限 */
#define MAXOBN 50 /* 消息的长度 */
#define MAXPRIOR 10 /* 优先数的最大值 */
struct q_entry
{ long mtype;
char mtext[MAXOBN+1];
};
*************************************************************
/* queuercv.c--- 从队列中取一个优先级最高的消息 */
#include
#include
#include "que.h"
main()
{
pid_t pid;
switch(pid=fork())
{ case 0:
sleep(1);
serve();
break;
case -1:
printf("Error: warning: fork to start serving failed");
break;
default:
printf("Server process pid is %dn",pid);
}
/* 没有出错返回0,否则返回1 */
exit(pid!=-1?0:1);
}
/* proc_obj--- 对消息作处理 */
int proc_obj(struct q_entry *msg)
{
printf("npriority:%ld name:%s n", msg->mtype, msg->mtext);
}
/* init_queue--- get queue identifier */
int init_queue(void)
{
int queue_id;
/* 创建或打开消息队列,队列标识为QKEY */
if ((queue_id=msgget(QKEY, IPC_CREAT|QPERM))==-1)
perror("msgget failed");
return(queue_id);
}
/* serve--- 处理队列中具有最高优先级的成员,优先数越小优先级越高 */
int serve(void)
{ int mlen,r_qid;
struct q_entry r_entry;
/* initialize message queue */
if ((r_qid=init_queue())==-1)
return(-1);
/* 获取并处理下一个消息 */
for (;;)
{
if ((mlen=msgrcv(r_qid,&r_entry,MAXOBN,(-1*MAXPRIOR),MSG_NOERROR))==-1)
{ perror("msgrcv failed");
return(-1);
}
else
{ /* 保证 mtext 是一个字符串 */
r_entry.mtext[mlen]='';
/* 处理消息 */
proc_obj(&r_entry);
}
}
}
**********************************************************
/* queuesnd.c--- 把一个消息放到队列 */
#include
#include
#include "que.h"
main(int argc,char * argv[])
{ int priority;
if (argc!=3)
{ printf("Error: Usage:%s objname priorityn",argv[0]);
exit(1);
}
if ((priority=atoi(argv[2]))MAXPRIOR)
{ printf("%s",argv[2]);
printf("Error: warning:%s n","invalid priority");
exit(2);
}
if (enter(argv[1],priority)MAXOBN)
{ printf("Error. warning:%s n","name too long");
return(-1);
}
if ((priority>MAXPRIOR || priority
参考que.h,queuesnd.c和queuercv.c,并改写它们,使放入队列的消息是一个已存在文件的内容(假设该文件长度小于que.h中定义的常数MAXOBN,即只需占一个消息)。就是只要改变输入到队列的信息的方式就行了
程序如下
/* que.h--- header for message IPC */
#include
#include
#include
#include
#include
#define QKEY (key_t)0206 /* 消息队列的标识符 */
#define QPERM 0660 /* 对队列的读写权限 */
#define MAXOBN 50 /* 消息的长度 */
#define MAXPRIOR 10 /* 优先数的最大值 */
struct q_entry
{ long mtype;
char mtext[MAXOBN+1];
};
*************************************************************
/* queuercv.c--- 从队列中取一个优先级最高的消息 */
#include
#include
#include "que.h"
main()
{
pid_t pid;
switch(pid=fork())
{ case 0:
sleep(1);
serve();
break;
case -1:
printf("Error: warning: fork to start serving failed");
break;
default:
printf("Server process pid is %dn",pid);
}
/* 没有出错返回0,否则返回1 */
exit(pid!=-1?0:1);
}
/* proc_obj--- 对消息作处理 */
int proc_obj(struct q_entry *msg)
{
printf("npriority:%ld name:%s n", msg->mtype, msg->mtext);
}
/* init_queue--- get queue identifier */
int init_queue(void)
{
int queue_id;
/* 创建或打开消息队列,队列标识为QKEY */
if ((queue_id=msgget(QKEY, IPC_CREAT|QPERM))==-1)
perror("msgget failed");
return(queue_id);
}
/* serve--- 处理队列中具有最高优先级的成员,优先数越小优先级越高 */
int serve(void)
{ int mlen,r_qid;
struct q_entry r_entry;
/* initialize message queue */
if ((r_qid=init_queue())==-1)
return(-1);
/* 获取并处理下一个消息 */
for (;;)
{
if ((mlen=msgrcv(r_qid,&r_entry,MAXOBN,(-1*MAXPRIOR),MSG_NOERROR))==-1)
{ perror("msgrcv failed");
return(-1);
}
else
{ /* 保证 mtext 是一个字符串 */
r_entry.mtext[mlen]='';
/* 处理消息 */
proc_obj(&r_entry);
}
}
}
**********************************************************
/* queuesnd.c--- 把一个消息放到队列 */
#include
#include
#include "que.h"
main(int argc,char * argv[])
{ int priority;
if (argc!=3)
{ printf("Error: Usage:%s objname priorityn",argv[0]);
exit(1);
}
if ((priority=atoi(argv[2]))MAXPRIOR)
{ printf("%s",argv[2]);
printf("Error: warning:%s n","invalid priority");
exit(2);
}
if (enter(argv[1],priority)MAXOBN)
{ printf("Error. warning:%s n","name too long");
return(-1);
}
if ((priority>MAXPRIOR || priority