Linux实验报告 下载本文

exit(0); }

【实验总结】

通过这次实验,了解什么是管道,知道了管道是UNIX系统的一大特色。所谓管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。

(四)消息的发送与接收实验

【实验内容】

1.消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。

<参考程序> ①client.c

#include #include #include #define MSGKEY 75 struct msgform { long mtype;

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 #include #include #define MSGKEY 75 struct msgform { long mtype;

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 #include #include #include #include #include #include #include #define MAX_TEXT 512

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,\