为了能向服务器进程发送控制消息,我们需要修改enter函数,使其支持接收控制消息并进行相应的处理。
首先,我们需要添加一个参数来表示控制消息的队列。这个队列将用于发送控制消息。然后,在发送普通消息之前,我们需要检查是否有控制消息需要发送。如果有,我们需要创建一个新的q_entry结构体来表示控制消息,并将其发送到队列中。
下面是修改后的enter函数的代码:
```c
int enter(char *objname, int priority, int control_qid) {
int len, s_qid;
struct q_entry s_entry; //structure to hold message
//validate name length, priority level
if ((len=strlen(objname))>MAXOBN) {
warn("name too long");
return(-1);
}
if (priority>MAXPRIOR||priority<0) {
warn("invalid priority level");
return(-1);
}
//initialize message queue as necessary
if ((s_qid=init_queue())==-1)
return(-1);
//check for control message
if (control_qid != -1) {
//create control message entry
struct q_entry c_entry;
c_entry.mtype = (long)CONTROL_MSG_TYPE;
strncpy(c_entry.mtext, objname, MAXOBN);
//send control message
if (msgsnd(control_qid, &c_entry, len, 0) == -1) {
perror("msgsnd failed");
return(-1);
}
}
//initialize s_entry
s_entry.mtype=(long)priority;
strncpy(s_entry.mtext, objname, MAXOBN);
//send message, waiting if necessary
if (msgsnd(s_qid, &s_entry, len, 0)==-1) {
perror("msgsnd failed");
return(-1);
} else {
return(0);
}
}
```
注意,我们添加了一个名为control_qid的新参数,并在函数中使用它来发送控制消息。如果control_qid为-1,则表示没有控制消息需要发送。