进程间通信
一、实验名称
进程间通信
二、实验内容
学生独立设计并实现消息传递系统进程间交换数据的任务。
三、实验原理和设计思路
在Linux系统下用signal()函数进行进程间通信,pipe()函数创建管道进行数据传送。
四、源代码
1.软中断通信
#include<unistd.h>
#include<stdio.h>
#include<signal.h>
void waiting(),stop();
int wait_mark;
main()
{
int p1,p2;
while((p1=fork())==-1);
if(p1>0)
{
while((p2=fork())==-1);
if(p2>0)
{
printf("parent \n");
wait_mark=1;
signal(SIGINT,stop);
waiting(0);
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf("parent process is killed! \n" );
exit(0);
}
else
{
printf("p2 \n");
wait_mark=1;
signal(17,stop);
waiting();
lockf(stdout,1,0);
printf("child process 2 is killed by parent! \n");
lockf(stdout,0,0);
exit(0);
}
}
else
{
printf("p1\n");
wait_mark=1;
signal(16,stop);
waiting();
lockf(stdout,1,0);
printf("chile process 1 is killed by parent! \n");
lockf(stdout,0,0);
exit(0);
}
}
void waiting()
{
while(wait_mark!=0);
}
void stop()
{
wait_mark=0;
}
2.软中断通信2
#include<unistd.h>
#include<stdio.h>
#include<signal.h>
int pid1,pid2;
int EndFlag=0,pf1,pf2=0;
void IntDelete()
{
kill(pid1,16);
kill(pid2,17);
EndFlag=1;
}
void Int1()
{
printf("child process 1 is killed by parent!");
exit(0);
}
void Int2()
{
printf("child process 2 is killed by parent!");
exit(0);
}
main()
{
int exitpid;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
while((pid1=fork())==-1);
if(pid1==0)
{
printf("p1\n");
signal(SIGUSR1,Int1);
signal(16,SIG_IGN);
pause();
exit(0);
}
else
{
while((pid2=fork())==-1);
if(pid2==0)
{
printf("p2\n");
signal(SIGUSR2,Int2);
signal(17,SIG_IGN);
pause();
exit(0);
}
else
{
printf("parent\n");
signal(SIGINT,IntDelete);
waitpid(-1,&exitpid,0);
printf("parent process is killed!\n");
exit(0);
}
}
}
3.管道通信
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
int pid1,pid2;
main( )
{
int fd[2];
char outpipe[100],inpipe[100];
pipe(fd);
while ((pid1=fork( ))==-1);
if(pid1==0)
{
lockf(fd[1],1,0);
sprintf(outpipe,"child 1 process is sending message!");
write(fd[1],outpipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
while((pid2=fork( ))==-1);
if(pid2==0)
{
lockf(fd[1],1,0);
sprintf(outpipe,"child 2 process is sending message!");
write(fd[1],outpipe,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0);
read(fd[0],inpipe,50);
printf("%s\n",inpipe);
wait(0);
read(fd[0],inpipe,50);
printf("%s\n",inpipe);
exit(0);
}
}
}
五、结果截图
图 1 软中断通信
图 2 软中断通信(2)
图 3 管道通信
六、编程体会
在这次的编程实验中,学会了在Linux系统下用signal()函数进行进程间通信,pipe()函数创建管道进行数据传送。开始的时候,连signal()、pipe()的函数定义、用法都不了解,后面通过查询百度,看了前辈写的一些学习心得,跟着他们的思路了解了一下,但是其实还是有很多的疑惑。后面又找了一些示例自己动手做了一下,这才真正了理解了这两个函数的真正意思。在Linux环境下,我们可以使用signal()函数进行进程间通信,pipe()函数创建管道进行数据传送,这为我们在编写程序的过程中提供了很大的便利性。在以前所学习的知识中,大多数的程序基本上都是单进程的,我们不需要考虑多进程同时运行所带来的影响,以及采取的正常方案。在实验中,发现通过signal、pipe函数可以很好的进行进程之间的通信、数据传输。希望以后可以继续深入学习这方面的知识,提示自己的专业能力。