AsahiMoon的博客

AsahiMoon的博客

操作系统实验小结

主要问题和小结:

1.创建进程时采用 while((p1=fork())==-1)可以保证进程创建成功
(没用这个的时候常会出现比如abc进程中可能只输出a或b之类的是因为c没有成功创建(系统原因))

2.主要问题还是在于输出的控制上,如果不是采用循环的话可能输出的效果不明显或者改变没有效果



signal()函数的第二个参数中要带参数;比如foo(int i){};然后再foo(1)这样带入参数,否则会报错;


//signal (SIGINT, SIG_IGN);
signal (SIGQUIT,SIG_IGN);
//signal(SIGINT,stop);
signal (SIGQUIT,stop);
改成这样后虽然signal (SIGQUIT,SIG_IGN);会屏蔽control+\的退出进程的效果,但是stop仍然可以获取control+\的输入从而进行对应的stop函数
(SIGINT同理)

理解为是系统屏蔽了这些输入的默认功能,但是仍然可以进行这些输入并获取



主要代码:

进程控制与中断:

#include <unistd.h>
#include <signal.h>
#include <iostream>
#include <sys/wait.h>
using namespace std;

int flag;
int pid1,pid2;

void waiting(int i)
{
while(flag);
}
void stop(int i)
{
flag=0;
}
int main()
{ //signal (SIGINT, SIG_IGN);
signal (SIGQUIT,SIG_IGN);
//signal(SIGINT,stop);
signal (SIGQUIT,stop);
while((pid1=fork())==-1);
if(pid1==0)
{
flag=1;
signal(SIGUSR1,stop);
waiting(0);
lockf(1,1,0);
cout<<"\nChild1 is killed\n";
lockf(1,0,0);
sleep(1);
exit(0);
} else
{
while((pid2=fork())==-1);
if(pid2==0)
{
flag=1;
signal(SIGUSR2,stop);
waiting(0);
lockf(1,1,0);
cout<<"\nchild2 is killed\n";
lockf(1,0,0);
sleep(1);
exit(0);
} else {
flag = 1;
wait(0);
kill(pid1, SIGUSR1);
kill(pid2, SIGUSR2);
wait(NULL);
cout << "\nFather is killed\n";
exit(0);
}
}

}






fork创建进程:

lockf的效果:





阅读更多
个人分类: 操作系统
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

操作系统实验小结

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭