第八周 补充 Linux进程管理Word下载.docx
《第八周 补充 Linux进程管理Word下载.docx》由会员分享,可在线阅读,更多相关《第八周 补充 Linux进程管理Word下载.docx(7页珍藏版)》请在冰点文库上搜索。
![第八周 补充 Linux进程管理Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/28/c6526c7a-8830-4d53-a9cb-a4b88a65bde4/c6526c7a-8830-4d53-a9cb-a4b88a65bde41.gif)
发送软中断就是向接收进程的proc结构中的相应项发送一个特定意义的信号。
3)陷阱:
由软件产生中断,指处理机和内存内部产生的中断。
4)异常。
二、相关函数
fork(),wait(),exit(),kill(),signal(),pipe()
1)fork()函数:
用于创建一个新进程(子进程)
•intfork();
•pid=fork();
•if(pid<
0){
•printf("
forkerror\n"
);
•exit(0);
}
•if(pid==0){
Thechildprocessisrunningnow!
\n"
}
•if(pid>
Theparentprocessisrunningnow!
2).wait()函数:
用来控制父进程与子进程的同步。
•#include<
sys/type.h>
sys/wait.h>
•(pid_t)wait(int*statloc);
3).exit()函数:
进程结束最常调用的函数
stdio.h>
•voidexit(intstatus);
4).kill()函数:
用于删除执行中的程序或者任务
•kill(intPID,intIID);
5).signal()函数是允许调用进程控制软中断信号的处理
signal.h>
•intsig;
•void(*func)();
•signal(sig,function);
6).pipe()函数用于创建一个管道。
•其调用格式为:
#include<
unistd.h>
•pipe(intfp[2]);
三、补充实验一:
编制实现软中断通信的程序
•Childprocess1iskilledbyparent!
!
•Childprocess2iskilledbyparent!
•Parentprocessiskilled!
•多运行几次编写的程序,简略分析出现不同结果的原因。
参考代码:
#include<
sys/types.h>
intwait_flag;
voidstop();
main(){
intpid1,pid2;
//定义两个进程号变量
signal(3,stop);
//或者signal(14,stop);
while((pid1=fork())==-1);
//若创建子进程1不成功,则空循环
if(pid1>
0){//子进程创建成功,pid1为进程号
while((pid2=fork())==-1);
//创建子进程2
if(pid2>
wait_flag=1;
sleep(5);
//父进程等待5秒
kill(pid1,16);
//杀死进程1
kill(pid2,17);
//杀死进程2
wait(0);
//等待第1个子进程1结束的信号
//等待第2个子进程2结束的信号
printf("
\nParentprocessiskilled!
exit(0);
//父进程结束
}
else{
signal(17,stop);
//等待进程2被杀死的中断号17
\nChildprocess2iskilledbyparent!
signal(16,stop);
//等待进程1被杀死的中断号16
\nChildprocess1iskilledbyparent!
exit(0);
voidstop(){
wait_flag=0;
四、补充实验二:
编制实现进程的管道通信的程序
使用系统调用pipe()建立一条管道线,两个子进程分别向管道写一句话:
•Childprocess1issendingamessage!
•Childprocess2issendingamessage!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
要求:
父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。
intpid1,pid2;
//定义两个进程变量
main(){
intfd[2];
charOutPipe[100],InPipe[100];
//定义两个字符数组
pipe(fd);
//创建管道
//如果进程1创建不成功,则空循环
if(pid1==0){//如果子进程1创建成功,pid1为进程号
lockf(fd[1],1,0);
//锁定管道
sprintf(OutPipe,"
\nChildprocess1issendingmessage!
//给Outpipe赋值
write(fd[1],OutPipe,50);
//向管道写入数据
sleep(5);
//等待读进程读出数据
lockf(fd[1],0,0);
//解除管道的锁定
//结束进程1
else{
while((pid2=fork())==-1);
//若进程2创建不成功,则空循环
if(pid2==0){
\nChildprocess2issendingmessage!
lockf(fd[1],0,0);
wait(0);
//等待子进程1结束
read(fd[0],InPipe,50);
//从管道中读出数据
printf("
%s\n"
InPipe);
//显示读出的数据
wait(0);
//等待子进程2结束
read(fd[0],InPipe,50);
printf("
exit(0);