操作系统软中断实验

    操作系统软中断实验是在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+\
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值