假设父进程先执行,父进程显示3行字符串; 父进程向子进程发送软中断信号,等待子进程终止后,父进程输出结束信息”OK!”,然后终止执行。 子进程循环显示”I am a child!”,接收到父进程发来的软信号后停止循环,显示”child exited!”并终止执行
时间: 2023-08-31 18:32:33 浏览: 200
### 回答1:
这是一个经典的进程间通信例子,可以用 C 语言来实现。
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void child_process(int sig) {
printf("child exited!\n");
exit(0);
}
int main() {
pid_t pid;
int status;
// 创建子进程
pid = fork();
if (pid < 0) {
perror("fork error");
exit(1);
} else if (pid == 0) {
// 子进程
signal(SIGINT, SIG_IGN); // 忽略 Ctrl+C 信号
while (1) {
printf("I am a child!\n");
sleep(1);
}
} else {
// 父进程
sleep(1); // 等待子进程执行
printf("Sending SIGINT to child process...\n");
kill(pid, SIGINT); // 发送软中断信号给子进程
wait(&status); // 等待子进程退出
printf("OK!\n");
exit(0);
}
}
```
这段代码首先创建了一个子进程,然后父进程等待 1 秒后发送软中断信号 SIGINT 给子进程。子进程接收到信号后会执行 child_process 函数,该函数输出 "child exited!" 并调用 exit 函数退出进程。父进程在子进程退出后输出 "OK!" 并调用 exit 函数退出进程。
### 回答2:
父进程首先执行,显示了3行字符串。接着,父进程向子进程发送了一个软中断信号,然后等待子进程终止。子进程接收到父进程发来的软中断信号后停止循环显示"I am a child!",并显示"child exited!",然后终止执行。父进程在子进程终止后输出"OK!",并终止执行。整个过程如下:
父进程:
- 执行开始,显示第一行字符串。
- 显示第二行字符串。
- 显示第三行字符串。
- 向子进程发送软中断信号。
- 等待子进程终止。
子进程:
- 循环执行以下步骤:
- 显示"I am a child!"。
- 接收父进程发来的软中断信号,停止循环。
- 显示"child exited!"。
- 终止执行。
父进程:
- 子进程已经终止,输出"OK!"。
- 终止执行。
### 回答3:
假设父进程先执行,父进程可以通过调用系统调用fork()创建一个子进程。父进程可以在创建子进程之后,先输出3行字符串,然后向子进程发送软中断信号。子进程可以循环地输出"I am a child!",并等待接收父进程发送的软中断信号。当子进程接收到软中断信号后,停止循环输出,并输出"child exited!",然后终止执行。父进程在子进程终止后可以输出"OK!",然后终止执行。
下面是一个可能的实现:
```python
import os
import signal
import time
def child_handler(signum, frame):
print("child exited!")
exit(0)
def parent_handler(signum, frame):
print("OK!")
exit(0)
# 创建子进程
pid = os.fork()
# 子进程
if pid == 0:
# 设置子进程接收信号的处理函数
signal.signal(signal.SIGUSR1, child_handler)
while True:
print("I am a child!")
time.sleep(1)
# 父进程
else:
# 输出3行字符串
print("String 1")
print("String 2")
print("String 3")
# 发送软中断信号给子进程
os.kill(pid, signal.SIGUSR1)
# 设置父进程接收信号的处理函数
signal.signal(signal.SIGUSR1, parent_handler)
# 等待子进程终止
os.waitpid(pid, 0)
```
以上代码是使用Python实现的,通过调用`os.fork()`创建子进程,并使用`os.kill()`向子进程发送信号。在父进程中,使用`os.waitpid()`函数等待子进程终止。子进程接收到信号后,调用信号处理函数退出循环并终止执行。父进程接收到信号后,也调用信号处理函数输出"OK!"并终止执行。
阅读全文