exit(0); }
【实验总结】
通过这次实验,了解什么是管道,知道了管道是UNIX系统的一大特色。所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。
(四)消息的发送与接收实验
【实验内容】
1.消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。
<参考程序> ①client.c
#include
char mtext[1000]; }msg;
int msgqid;
void client() {
int i;
msgqid=msgget(MSGKEY,0777); /*打开75#消息队列*/ for(i=10;i>=1;i--) {
msg.mtype=i;
printf(“(client)sent\\n”);
msgsnd(msgqid,&msg,1024,0); /*发送消息*/ }
exit(0); }
main( ) {
client( ); }
②server.c
#include
char mtext[1000]; }msg;
int msgqid;
void server( ) {
msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建75#消息队列*/ do {
msgrcv(msgqid,&msg,1030,0,0); /*接收消息*/
printf(“(server)received\\n”);
}while(msg.mtype!=1);
msgctl(msgqid,IPC_RMID,0); /*删除消息队列,归还资源*/ exit(0); }
main( ) {
server( ); }
程序说明:
①为了便于操作和观察结果,编制二个程序client.c和server.c,分别用于消息的发送与接收。 ②server建立一个 Key 为75的消息队列,等待其它进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出server。server每接收到一个消息后显示一句“(server)received。”
③client使用 key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后一个消息,即是 server端需要的结束信号。client 每发送一条消息后显示一句 “(client)sent”。 ④注意: 二个程序分别编辑、编译为client与server。 执行: 实验截图:
2. 在父进程中创建一个消息队列,用fork创建一个子进程,在子进程中将一条消息传送至消息队列,父进程接受队列的消息,并将消息送屏幕显示。
编写程序如下:
#include
struct msg_st //消息队列的结构体 {
int my_msg_type;
char msg_text[BUFSIZ]; };
int main(int argc,char **argv) {
pid_t pid; int i = 1; int status;
if( (pid = fork()) == -1) {
perror(\ exit(EXIT_FAILURE); }
else if ( pid == 0) //子进程 {
struct msg_st some_data; int msgid;
char buffer[BUFSIZ];
if((msgid = msgget((key_t)12345,0666|IPC_CREAT)) == -1 ) {
perror(\ exit(EXIT_FAILURE); }
printf(\ fgets(buffer,BUFSIZ,stdin); some_data.my_msg_type = 1;
strcpy(some_data.msg_text,buffer);
if((msgsnd(msgid,(void *) &some_data,MAX_TEXT,0)) == -1) {
perror(\ exit(EXIT_FAILURE); } return 0; }
else //父进程 {
int msgid1;
struct msg_st some_data1; int msg_to_recevie = 0;
if((msgid1= msgget((key_t)12345,0666|IPC_CREAT)) == -1) {
perror(\ exit(EXIT_FAILURE); }
if(msgrcv(msgid1,(void *) &
some_data1,BUFSIZ,msg_to_recevie , 0) == -1) {
perror(\ exit(EXIT_FAILURE); }
printf(\ if(msgctl(msgid1,IPC_RMID,0) == -1) {
fprintf(stderr,\