进程软中断通信

本文详细介绍了如何在Linux环境下,通过编程实现进程间的软中断通信,包括使用`fork()`创建子进程,`signal()`设置信号处理函数,以及`wait()`等待子进程结束。通过实例展示,探讨了信号机制在进程通信中的作用和控制策略,如处理不同类型的信号和避免意外终止。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验目的及要求

  1. 了解什么是信号
  2. 熟悉LINUX系统中进程之间软中断通信的基本原理

二、实验工具

PC机、Vmware station虚拟机软件、Ubuntu 16操作系统

三、实验内容及步骤

<任务>

编程实现,父进程生成子进程,父进程发送信号并等待,子进程接收信号并完成某种功能,然后自我终止并唤醒父进程。

任务一程序:

编译并且运行:

任务一结果:

任务一分析:

这是一个使用信号机制实现进程间通信的程序。其中,主进程先设置了中断信号17的信号处理函数为func(),然后调用fork()函数创建了子进程,并向子进程发送了中断信号17。

在子进程中,首先调用sleep()函数使其挂起10秒钟,等待接收来自父进程的信号。当子进程接收到中断信号17时,会触发func()函数,输出相应的提示信息并退出。

在主进程中,首先输出相应的提示信息,然后调用wait()函数等待子进程结束。当子进程结束后,主进程会输出“Parent: finished!”的提示信息,并正常退出。

总的来说,这是一个简单的进程间通信程序,通过信号机制实现了父子进程之间的消息交互。同时,通过信号处理函数,可以对不同类型的信号进行不同的处理操作,实现更加灵活和精细的控制。

<任务>

编写进程,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即DEL键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止。

child process 1 is killed by parent!

child process 2 is killed by parent!

父进程等待两个子进程终止后,输出以下信息后终止。

Parent process is killed!

程序:

编译并且运行:

运行结果:

按下ctrl+c中断进程时,程序才执行,父进程打印消息,父进程kill子进程,子进程1收到消息上锁,然后解锁关闭进程,随后子进程2同样操作,然后父进程打印,最后中断进程。

任务二分析:

这是一个使用信号机制实现进程通信和控制的程序。其中,主进程通过调用fork()函数创建了两个子进程p1和p2,然后向p1和p2分别发送了中断信号16和17,以杀死它们。

在程序中,通过wait_mark变量的值来控制各个进程的运行状态,同时使用signal()函数设置信号处理函数。当主进程接收到DEL信号时,会调用stop()函数,将wait_mark的值设为0,从而让各个子进程退出等待状态并终止运行。

在子进程中,首先设置了各自的信号处理函数和等待状态。当接收到相应的中断信号时,子进程会被杀死,同时输出相应的提示信息,并使用lockf()函数对标准输出进行加锁操作,以避免输出混乱。

总的来说,这是一个比较简单的进程通信和控制程序,通过信号机制控制各个进程的运行流程,实现了多进程之间的协同工作。

任务二问题:

  1. 该程序段前面部分用了两个wait(0),为什么?

答:wait(0暂时停止目前进程的执行,直到信号来到或子进程结束,如果在调用wait(0)时子进程已经结束,则wait(0)会立即返回子进程结束状态值。

  1. 该程序段中每个进程退出时都用了语句exit(0),为什么?

答:因为在强调处强行退出程序,运行一次程序就结束。

<任务三>

在上面程序中,增加语句signal(SIGINT,SIG_IGN)、signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。

程序:

编译并且运行:

运行结果:

任务三分析:

这是一个使用信号机制实现进程间通信和控制的程序。主进程通过调用fork()函数创建了两个子进程p1和p2,并向它们分别发送用户自定义信号SIGUSER1和SIGUSER2,以触发相应的信号处理函数int1()和int2(),输出相应的提示信息并退出进程。

在主进程中,首先设置了DEL信号的信号处理函数为intdelete(),并使用waitpid()函数等待子进程的结束信号,从而使主进程最后退出。

在子进程中,分别设置了SIGUSER1和SIGUSER2的信号处理函数,并使用pause()函数将子进程挂起,等待父进程发送相应的信号。当子进程接收到相应的信号时,会触发相应的信号处理函数,并输出相应的提示信息和退出。

同时,在子进程中,还使用signal()函数对SIGINT和SIGQUIT信号进行忽略操作,避免意外终止进程的出现。

总的来说,这是一个比较完整、细致的、使用信号机制实现进程通信和控制的程序。通过信号处理函数和信号控制语句,实现了多进程之间的协同工作。

四、实验总结

进程软中断通信是一种进程间通信的方式,通过向另一个进程发送软中断信号,来实现消息的传递和处理。在实验中,我通过编写一个简单的程序,展示了如何使用软中断信号在两个进程之间进行通信。

通过本次实验进一步认识了并发执行的实质,了解到了进程互斥的进程竞争资源的现象。

### 进程软中断通信的相关头文件 在 Linux 系统中,进程间的软中断通信主要依赖于信号机制。以下是与进程软中断通信相关的头文件及其功能: #### 1. `<signal.h>` 该头文件定义了信号处理的核心接口和数据结构,其中包括 `sigaction` 函数以及相关结构体的声明[^3]。通过这个头文件,开发者可以实现自定义信号处理器来响应各种类型的软中断。 - **核心函数**: `sigaction()` 是用来注册信号处理器的主要方法之一。 - **重要结构体**: `struct sigaction` 定义了如何设置信号行为,包括指定信号处理函数 (`sa_handler`) 或者带有附加信息的扩展版处理函数 (`sa_sigaction`)。 #### 2. `/usr/include/i386-linux-gnu/bits/siginfo.h` 此路径下的头文件提供了关于信号发送方的信息结构体定义[^2]。具体来说,它描述了一个名为 `siginfo_t` 的复杂结构体,其中包含了触发信号的原因、发起者的 PID 和 UID 等细节。 这些字段允许接收端获取更多上下文信息以便更精确地决定后续操作逻辑。 --- ### 关于“歌曲”的误解澄清 如果这里的“歌曲”并非字面意思而是某种隐喻表达,则可能是指代某些特定的技术术语或者概念名称听起来像音乐作品名;然而基于当前已知资料并没有发现任何直接关联两者之间联系的内容存在因此无法对此部分做出进一步解释除非提供更多背景线索帮助理解意图所在[^无对应引用]. --- ### 示例代码展示信号处理过程 下面是一个简单的例子演示如何利用上述提到的功能来进行基本的信号捕获并执行相应动作: ```c #include <stdio.h> #include <stdlib.h> #include <signal.h> void handler(int signo){ printf("Caught signal %d\n",signo); } int main(){ struct sigaction act; act.sa_handler = handler; sigemptyset(&act.sa_mask); act.sa_flags=0; if (sigaction(SIGINT,&act,NULL)==-1){ perror("Error setting signal action"); exit(1); } while(1){sleep(1);} return 0; } ``` 以上程序会持续运行直到收到键盘输入产生的 SIGINT(通常是 Ctrl+C),之后打印消息确认捕捉到了该信号。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值