示例:进程C,实现获取键盘的输入,每次输入后给进程D发送一个信号sigqueue(),附加信息:输入的字符。 要求:进程D中显示进程C运行期间用户从键盘上按下的字符。
时间: 2024-02-21 08:56:34 浏览: 199
以下是进程C的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#define SIG_USER 40 // 自定义信号
void handler(int sig, siginfo_t *si, void *uc) {
printf("进程D接收到信号:%d,附加信息:%c\n", sig, si->si_value.sival_char);
}
int main() {
int fd[2];
char buf[256];
if (pipe(fd) < 0) {
perror("pipe error");
exit(1);
}
pid_t pid = fork();
if (pid < 0) {
perror("fork error");
exit(1);
} else if (pid == 0) { // 子进程D
close(fd[1]); // 关闭写端
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_sigaction = handler;
act.sa_flags = SA_SIGINFO;
sigaction(SIG_USER, &act, NULL);
while (1) {
pause(); // 等待信号
}
} else { // 父进程C
close(fd[0]); // 关闭读端
while (1) {
printf("请输入一个字符:");
scanf("%s", buf);
if (strlen(buf) > 0) {
printf("输入:%c\n", buf[0]);
sigqueue(pid, SIG_USER, (union sigval){.sival_char = buf[0]}); // 发送信号
}
}
}
return 0;
}
```
进程C中,首先创建一个管道,然后使用 `fork()` 函数创建一个子进程D。在父进程C中,关闭管道的读端,然后不断循环等待用户输入一个字符,如果有输入,则打印输入的字符,并使用 `sigqueue()` 函数将该字符以信号的形式发送给子进程D。
在子进程D中,关闭管道的写端,然后使用 `sigaction()` 函数注册信号处理函数,等待接收父进程C发送的信号。当收到信号后,使用 `siginfo_t` 结构体获取附加信息,即输入的字符,然后打印该字符即可。
需要注意的是,由于 `scanf()` 函数是阻塞式的输入函数,因此需要在父进程C中使用 `fgets()` 函数或其他非阻塞式的输入函数来获取用户输入。
阅读全文