一、实验目的与任务
目的:了解掌握操作系统管道与信号的特点与功能,学会借助管道与信号的功能函数进行编程。
任务:利用C语言指令编写程序调用管道与信号函数,完成相应功能。
二、实验设备
装有Linux操作系统的计算机一台。
三、实验要求
1、实验内容与要求:
1)验证管道和命名管道函数功能。
2)利用信号进行进程间的通信。
2、实验安排方式:采用1人1组,上机在Linux系统下进行编程实验。
四、实验内容
1.创建1个子线程,利用管道实现父子间的通信,子线程写入自己的学号和姓名,父进程通过管道读取子进程写入的内容,并在父进程中输出读取的内容以及进程id。
#include
#include
#include
#include
#include
#include
int main()
{
int fd[2];
int ret=pipe(fd);
if(ret==-1)
{
perror("pipe");
exit(1);
}
pid_t pid;
pid=fork();
if(pid==0)
{
close(fd[0]);
char *p="542113430809ljh\n";
write(fd[1],p,strlen(p)+1);
close(fd[1]);
wait(NULL);
}
else if(pid>0)
{
printf("pid:%d,ppd:%d\n",getpid(),getppid());
close(fd[1]);
char buf[64] = {0};
ret=read(fd[0],buf,sizeof(buf));
close(fd[0]);
write(STDOUT_FILENO,buf,ret);
}
return 0;
}
2.创建2个进程,使用FIFO实现进程间通信,并对代码做出详细注释。
fifo_write.c
fifo_read.c
fifo_write.c
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
if(argc<2)
{
printf("./a.out fifoname\n");
exit(1);
}
int ret=access(argv[1],F_OK);
if(ret==-1)
{
int r=mkfifo(argv[1],0664);
if(r==-1)
{
perror("mkfifo");
exit(1);
}
else
printf("fifo creat success\n");
}
int fd=open(argv[1],O_WRONLY);
while(1)
{
char *p="hello,world";
write(fd,p,strlen(p)+1);
sleep(1);
}
close(fd);
return 0;
}
fifo_read.c
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
if(argc<2) //判断是否传入了文件名
{
printf("./a.out fifoname\n");
exit(1);
}
int ret=access(argv[1],F_OK);//判断文件是否存在
if(ret==-1) //如果文件不存在就创建文件
{
int r=mkfifo(argv[1],0664);
if(r==-1) //判断文件是否创建成功
{
perror("mkfifo");
exit(1);
}
else
printf("fifo creat success\n");
}
int fd=open(argv[1],O_RDONLY);/打开文件
if(fd==-1)
{
perror("open");
exit(1);
}
while(1) //不断读取fifo中的数据并打印
{
char buf[1024]={0};
read(fd,buf,sizeof(buf));
printf("buf=%s\n",buf);
}
close(fd); //关闭文件
return 0;
}
五、分析总结
通过这次实验,我了解掌握操作系统管道与信号的特点与功能,学会借助管道与信号的功能函数进行编程。并且能够利用C语言指令编写程序调用管道与信号函数,来完成相应功能。
关于管道(Pipe):我对使用管道进行进程间通信的实验心得是,管道是一种单向通信机制,适合用于具有父子关系的进程之间的通信。在实验中,我发现通过创建管道可以轻松地在两个相关的进程之间传递数据,例如一个进程可以将输出通过管道传递给另一个进程进行处理。但是,由于管道是单向的,如果需要双向通信,则需要创建两个管道。
关于信号(Signal):在使用信号进行进程间通信的实验中,我发现信号是一种轻量级的通信方式,适合用于在不同进程之间发送简单的通知或者事件。通过发送不同的信号,可以实现进程间的相互通知和控制。但是,信号的处理和使用需要小心,因为信号是异步的,可能会造成一些意想不到的情况,比如信号丢失或者产生竞争条件。
总的来说,管道适合用于进程之间的数据流通信,而信号适合用于进程之间的简单通知和控制。在实际的编程中,可以根据具体的需求选择合适的通信方式来实现进程间的通信。