Linux系统编程实验六进程间通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验六:进程间通信

实验目的:

学会进程间通信方式:无名管道,有名管道,信号,消息队列,

实验要求:

(一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一消息队列,实现向队列中存放数据和读取数据

实验器材:

软件:安装了Linux的vmware虚拟机

硬件:PC机一台

实验步骤:

(一)无名管道的使用

1、编写实验代码pipe_rw.c

#include

#include

#include

#include

#include

#include

int main()

{

int pipe_fd[2];//管道返回读写文件描述符

pid_t pid;

char buf_r[100];

char* p_wbuf;

int r_num;

memset(buf_r,0,sizeof(buf_r));//将buf_r初始化

char str1[]=”parent write1 “holle””;

char str2[]=”parent write2 “pipe”\n”;

r_num=30;

/*创建管道*/

if(pipe(pipe_fd)<0)

{

printf("pipe create error\n");

return -1;

}

/*创建子进程*/

if((pid=fork())==0) //子进程执行代码

{

//1、子进程先关闭了管道的写端

close(pipe_fd[1]);

//2、让父进程先运行,这样父进程先写子进程才有内容读sleep(2);

//3、读取管道的读端,并输出数据

if(read(pipe_fd[0],buf_r, r_num)<0)

{

printf(“read error!”);

exit(-1);

}

printf(“%s\n”,buf_r);

//4、关闭管道的读端,并退出

close(pipe_fd[1]);

}

else if(pid>0) //父进程执行代码

{

//1、父进程先关闭了管道的读端

close(pipe_fd[0]);

//2、向管道写入字符串数据

p_wbuf=&str1;

write(pipe_fd[1],p_wbuf,sizof(p_wbuf));

p_wbuf=&str2;

write(pipe_fd[1],p_wbuf,sizof(p_wbuf));

//3、关闭写端,并等待子进程结束后退出

close(pipe_fd[1]);

}

return 0;

}

/***********************

#include

#include

#include

#include

#include

#include

int main()

{

int pipe_fd[2];//管道返回读写文件描述符

pid_t pid;

char buf_r[100];

char* p_wbuf;

int r_num;

memset(buf_r,0,sizeof(buf_r));//将buf_r初始化

char str1[]="holle";

char str2[]="pipe";

r_num=10;

/*创建管道*/

if(pipe(pipe_fd)<0)

{

printf("pipe create error\n");

return -1;

}

/*创建子进程*/

if((pid=fork())==0) //子进程执行代码

{

close(pipe_fd[1]);//1、子进程先关闭了管道的写端//2、让父进程先运行,这样父进程先写子进程才有内容读

//3、读取管道的读端,并输出数据

if(read(pipe_fd[0],buf_r, r_num)<0)

{

printf("read1 error!");

exit(-1);

}

printf("\nparent write1 %s!",buf_r);

sleep(1);

if(read(pipe_fd[0],buf_r, r_num)<0)

{

printf("read2 error!");

exit(-1);

}

printf("\nparent write2 %s!",buf_r);

close(pipe_fd[1]);//4、关闭管道的读端,并退出exit(1);

//printf("child error!");

}

else if(pid>0) //父进程执行代码

{

close(pipe_fd[0]);//1、父进程先关闭了管道的读端

p_wbuf=str1;//2、向管道写入字符串数据

相关文档
最新文档