操作系统软中断实验是在Linux操作系统完成,我在实验过程中也是遇到了很多问题。我在这里记录一下,也可以和大家一起交流。
一、题目
使用C语言编写程序,实现当按下组合键Ctrl+\
的时候,先打印出子进程结束的信息,最后打印出父进程结束的信息。
二、源代码
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
void waiting();
void stop();
int wait_mark;
int main()
{
pid_t p1;
while ((p1 = fork()) == -1);
if (p1>0) //if p1 is parent process
{
lockf(1,1,0);
printf("parent process is %d \n", getpid());
lockf(1,0,0);
wait_mark=1;
signal(SIGQUIT, stop);
waiting();
kill(p1,16); //send signal 16 to end the process p1
wait(0); //waiting for the ending of p1
lockf(1,1,0);
printf("parent process is killed!\n");
lockf(1,0,0);
exit(0); //quit from the parent process
}
else //if p1 is child process
{
lockf(1,1,0);
printf("child process %d is created by the parent %d \n", getpid(), getppid());
lockf(1,0,0);
signal(SIGQUIT,SIG_IGN);
wait_mark=1;
signal(16, stop);
waiting();
lockf(1,1,0);
printf("child process %d is killed by parent %d \n", getpid(), getppid());
lockf(1,0,0);
exit(0); // p1 quit
}
return 0;
}
void waiting( )
{
while (wait_mark != 0);
}
void stop()
{
wait_mark=0;
}
三、关于fork()函数
一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成两个进程在执行了,这两个进程的几乎完全相同,将要执行的下一条语句都是if(fpid<0)……
为什么两个进程的fpid不同呢,这与fork函数的特性有关。fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
- 在父进程中,fork返回新创建子进程的进程ID;
- 在子进程中,fork返回0;
- 如果出现错误,fork返回一个负值;
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
四、关于lockf()函数
Linux中借助lockf机制,保证只有一个任务进程在执行。文件锁机制的作用:防止多个程序同时对一个不允许同时操作的工作做操作,在这个程序中是防止同时使用IO。
五、关于signal()函数
- signal(SIGQUIT, stop); // 收到SIGNUIT信号的时候执行stop操作
- signal(SIGQUIT,SIG_IGN); // 忽略SIGQUIT类型的信号
- SIGQUIT的信号指的是
Ctrl+\