- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
进程间通信实验解析
进程间通信(1)
调试以下程序给出运行结果并分析其程序原理:
#include stdio.h
#include unistd.h
#include wait.h
#include signal.h
#include stdlib.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
(1)编写两个程实现进程的无名管道和有名管道通信。要求分别调用pipe()、close()、write()、read()、popen()、pclose()、mknod()、mkfifo()、open()实现多个进程间的通信。
1.使用无名管道pipe(),进行父子进程之间的通信。
编写的程序如下:
fork函数执行完毕后,返回值pid0,则子进程创建失败,pid0,则运行父进程,关闭读操作,进行写操作,将信息写进管道,写完后关闭写操作,父进程挂起。Pid=0,运行子程序,关闭写操作,进行读操作,读完信息关闭读操作,子进程运行结束,父进程继续运行。
2.以命名行为参数的管道文件的示例。(假设有一个可执行程序chcase,从标准输入设备读字符,将小写字母转化成大写字母并输出。主程序使用popen创建管道,实现蒋某文本文件中的字幕转化成大写字母,其中的文本文件名作为参数传进来。)
命令行数量不为2时,输出结果如图所示;
创建一个可执行程序chcase,此程序从标准输入设备读字符,将小写字母转化成大写字母并输出。主程序使用popen()创建一个管道。再创建一个文本文件,输入将要转换成大写字母的小写字母。Popen创建的管道一头与文本文件相连,获取文本文件中的信息,将此信息通过管道传送给与管道另一端相连的可执行程序chcase,chcase获取文本文件中的小写字母后,将小写字母转换成大写字母输出。
创建有名管道。
当输入命令行数量为2时,打开管道,只进行写操作。不为2时,打开管道,只进行读操作。
且均循环26次。
4.软中断机制
#includestdio.h
#includesignal.h
#includeunistd.h
void waiting(),stop(),alarming();
int wait_mark;
main()
{
int p1,p2;
if(p1=fork())
{
if(p2=fork())
{
wait_mark=1;
signal(SIGINT,stop);
signal(SIGALRM,alarming);
waiting();
kill(p1,16);
kill(p2,17);
wait(0);
wait(0);
printf(parent process is killed!\n);
exit(0);
}
else
{
wait_mark=1;
signal(17,stop);
signal(SIGINT,SIG_IGN);
while (wait_mark!=0);
lockf(1,1,0);
printf(child process2 is killed by parent!\n);
lockf(1,0,0);
exit(0);
}
}
else
{
wait_mark=1;
signal(16,stop);
signal(SIGINT,SIG_IGN);
while (wait_mark!=0)
lockf(1,1,0);
printf(child process1 is killed by parent!\n);
lockf(1,0,0);
exit(0);
}
}
void waiting()
{
sleep(5);
if (wait_mark!=0)
kill(getpid(),SIGALRM);
}
void alarming()
{
wait_mark=0;
}
void stop()
{
wait_mark=0;
}
程序调用fork()函数创建两个子进程,开始两个子进程处于等待状态。singal()函数让父进程获取中断信号^C;当父进程获取该中断信号后,父进程调用Kill()函数向两个子进程发出信号,该信号的作用是让子进程从等待状态转为执行状态,子进程捕捉到该信号后分别执行各自的程序。两个子进程执行完成后,父进程收到相应信号后,执行程序。
5.信号程序实例与修正
#include stdio.h
#include sig
文档评论(0)