教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教学研究 >

实验二 Linux进程间通信

来源:网络收集 时间:2026-08-31
导读: 实验二 Linux进程间通信 1.实验目的 (1) 分析进程争用临界资源的现象,学习解决进程互斥的方法; (2) 学习如何利用进程的“软中断”、管道机制进行进程间的通信,并加深对 上述通信机制的理解; (3) 了解系统调用pipe( )、msgget( )、msgsnd( )、msgr

实验二 Linux进程间通信

1.实验目的

(1) 分析进程争用临界资源的现象,学习解决进程互斥的方法;

(2) 学习如何利用进程的“软中断”、管道机制进行进程间的通信,并加深对

上述通信机制的理解;

(3) 了解系统调用pipe( )、msgget( )、msgsnd( )、msgrcv( )、msgctl( )、shmget( )、

shmat( )、shmdt( )、shmctl( )的功能和实现过程,利用共享存储区机制进行进程间通信。

2.实验内容

(1) 进程的控制

编写一段程序,使用系统调用fork()创建两个子进程。各进程循环显示不同的信息(如20次):父进程显示:“parent:”加上进程ID,子进程分别显示:“Child1:”(或“Child2:”)加上自己的进程ID。观察程序执行时屏幕上出现的现象,并分析原因,进一步理解各个进程争夺临界资源(显示器)的情况。 接着在程序中使用系统调用locking( )来给每一个进程加锁,实现进程之间的互斥,试观察并分析出现的现象。

(2) 进程的软中断通讯

编制一段程序,实现进程的软中断通讯:使用系统调用fork( )创建两个子进程;再使用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按Del键);在捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发信号;子进程捕捉到信号后分别输出下列信息后终止:

Child process1 is killed by parent!

Child process2 is killed by parent!

父进程等待两个子进程都终止以后,输出如下信息后终止: Parent process in killed!

(3) 进程的管道通讯

编制一段程序,实现进程的管道通讯:使用系统调用pipe( )建立一条管道线;两个子进程分别循环向这条管道写一句话:

Child 1 is sending a message!

Child 2 is sending a message!

而父进程则循环从管道中读出信息,显示在屏幕上。

3.实验提示

(1) 用4个基本系统调用实现进程的创建,执行和自我终止:

① fork() 创建一个子进程。用它创建的子进程是fork调用者进程(即父进程)的复制品,即进程映象。除了进程标识数以及与进程特性有关的一些参数外,其它与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度。

如果创建进程失败,则fork()返回值为-1;若创建进程成功,则从父进程返回值是子进程号,从子进程返回的值是0。m=fork()。

② wait()

③ exit()

④ getpid()

编程示例:

例1:编写一个程序,父进程生成一个子进程,父进程等待子进程wait(),子进程执行完成后自我终止exit(),并唤醒父进程。父、子进程执行时打印有关信息。

main()

{ int i,j,k;

if (i=fork()) // 非零值

{ j=wait();

printf("Parent process!\n");

printf(“i=%d j=%d\n”, i, j);

}

else{ k=getpid();

printf("Child process!\n");

printf(“i=%d k=%d\n”, i, k);

}

}

父进程处于阻塞(或等待)状态,等待子进程执行完成终止后子进程自我终止,释放所占资源,通知父进程可以删除自己。获得进程的标识数(进程号),一般是正整数。P=getpid()。 继续工作。其返回值为等待子进程的子进程号。n=wait()。 此时它的状态变成P_state=SZOMB。

(2) 进程的“软中断”通信

它可用于同一用户的进程之间通信。其方式是:一个进程通过系统调用kill(pid,sig) 向同一用户的其它进程pid发送一个软中断信号;另一进程通过系统调用signal(sig,func)捕捉到信号sig后,执行预先约定的动作func,从而实现这两个进程间的通信。

① 发送信号kill(pid,sig),本进程将指定信号sig发送给指定进程pid,其

中参数为pid进程号,pid与sig均为整数值.

② 接收信号signal(sig,func),本进程接收到其它进程发送给它的信号后,完成指定的功能func. func一般是函数.

例2. 编写一个程序,父进程生成子进程,父进程发送信号并等待,子进程接收信号并完成某种功能,然后自我终止并唤醒父进程.

int func();

main()

{ int i,j:

signal(17,func);

if(i=fork())

{ printf("Parent: Signal 17 will be send to Child! \n");

kill(i,17);

wait(0);

printf("Parent: finished! \n");

}

else{ sleep(10);

printf("Child: A signal from my Parent is received! \n") ;

exit();

}

}

func()

{printf("It is signal 17 processing function! \n");

执行结果如下:

Parent: Signal 17 will be send to Child!

It is signal 17 processing function!

Child: A signal from my Parent is received!

Parent: finished!

在程序中系统调用sleep(second)用于进程的同步与互斥,自变量是暂停秒数.其功能是使现行进程暂停执行由自变量规定的秒数.

类似的系统调用有pause(),它的功能是暂停执行本进程,等待kill发来的信号,收到信号后再继续执行.

在特殊情况下,常用到如下语句signal(SIGINT,SIG_IGN).它表示遇到了中断信号SIGINT(按Del键).本进程不做任何动作,即勿略该中断信号对本进程的影响.

(3) 进程的控制

利用系统调用lockf(fd,mode,size),对指定文件的指定区域(由size指示)进行加锁或解锁,以实现进程的同步与互斥.其中fd是文件描述字;mode是锁定方式,=1表示加锁,=0表示解锁,size是指定文件fd的指定区域,用0表示从当前位置到文件尾.

常用程序段

fd = open( "a.out",2 );

if( i==0 )

{ lockf(fd,1,0);

………

lockf(fd,0,0);

}

例3. 编写一个程序,创建一个文件,文件名为lock.dat,同时父进程创建2个子进程,通过系统调用lockf(),分别让2个子进程对文件加锁,再输出有关信息,然后解锁.

char buf[]={"check lock!\n"};

main()

{ int i,p1,p2,fd;

fd=creat("lock.dat",0644);

write(fd,buf,20);

while((p1=fork())==-1);

if(p1==0)

{lockf(fd,1,0);

for (i=1;i<=3;i++)

printf("child1!\n");

lockf(fd,0,0);

}

else{while((p2=fork())==-1);

if (p2==0)

{lockf(fd,1,0);

for (i=1;i<=4;i++)

printf("child2!\n");

lockf(fd,0,0);

}

else printf("parrent!\n");

}

close(fd);

}

(4) 进程管道的通信

建立进程间的管道,格式为:

pipe(fd);

int fd[2];

其中,fd[1] 是写端,向管道中写入;

fd[0] 是读端,从管道中读出;

本质上将其当作文件处理.进程间可通过管道,用write与read来传递数据,但write与read不可以同时进行,在管道中只能有4096字节的数据被缓冲.

例4. 编写一个程序,建立一个pipe,同时父进程产生一个子进程,子进程向pipe中写入一个字符串,父进程从中读出该字符串,并每隔3秒种输出打印一次.

{ int x,fd[2];

char S[30];

pipe(fd);

for (;;)

{ x=fork();

if (x==0)

{sprintf(S,"Good-n …… 此处隐藏:1948字,全部文档内容请下载后查看。喜欢就下载吧 ……

实验二 Linux进程间通信.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1569684.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)