供大家交流学习,最好自己动手做,这样才有最深切的体会。

 

1.实验目的

了解并掌握利用信号通信机制在父子进程间进行通信。

 

 

2.实验软硬件环境

  • 安装Windows XP的计算机
  • VirtualBox软件,以及在其上安装的Ubuntu虚拟机

 

 

3.实验内容

    在Linux下利用信号通信机制在父子进程间进行通信。由子进程发送事件信号,父进程获取事件信号后进行相应的处理,将结果输出到终端。

    使用函数:

  • void (*signal(int  signum,   void(* handler)(int)))(int)                                                            设置某一信号的对应动作。                                                                                                           第一个参数      signum指明了所要处理的信号,64种。它可以取除了SIGKILL和SIGSTOP外的任何一种信号。                                                                                                                     第二个参数      handler描述了与信号关联的动作(处理的方式)                                        第二个参数可以取以下三种值                                                                                                   (1)一个无返回值的函数地址    捕获     此函数必须在signal()被调用前声明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。     执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行handler中的函数。当函数执行结束后,控制权返回进程被中断的那一点继续执行。                                                                                                             (2)SIG_IGN   忽略     这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。SIGKILL,SIGSTOP不能被忽略,也不能被处理。   (3)SIG_DFL   默认     这个符号表示恢复系统对信号的默认处理。
     
  • int    kill (pid_t  pid,  int  sig)                                                                                                        用于向进程发送信号

 

 

 

4.实验程序及分析

实验程序:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<wait.h>

void process()
{
    puts("\n\tin process recived a signal");
    printf("\tpid here is %d\n",getpid());
    puts("\tprocess end\n");
    //输出运行process函数的进程pid,即接收信号的进程

}

int main()
{
    signal(SIGUSR2,process);
    //设置信号种类为SIGUSR2,接收到该信号的进程要运行process函数
    int pid;
    pid = fork();
    //创建子进程
    if(pid == 0)
    {
        puts("\nin child");
        puts("deliver a signal to parent ...");
        kill(getppid(),SIGUSR2);
        //发送信号到父进程    
        printf("my pid is %d\nparent's pid is %d\n",getpid(),getppid());
        puts("child end\n");
    }
    else if(pid>0)
    {
        waitpid(pid,NULL,0);
        //等待子进程
        puts("\nin parent");
        printf("my pid is %d\n",getpid());
        puts("parent end\n");
    }
    else
    {
        puts("failed to create a child process\n");
    }

return 0;
}

 

终端结果:

 

 

分析:

线程共享进程的地址空间,所以线程对资源的改变会反映到进程中,故i之前为3,进入线程后被改为2,在进程中输出为2.并且线程自己返回的tid与pthread_create()函数返回到l的值是一样的。

 

5.实验截图

 

 

6.实验心得体会

    此次实验signal()函数利用信号实现了父进程和子进程之间的通信,参照书上相关内容,成功地在Linux下完成了该次实验,让我对信号通信机制有了更深的了解。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐