设计一个程序,该程序同时创建2个子进程,父进程先发送信号给子进程1,并在信号中携带附加信息,该信息是一个指针指向字符串数组 父进程定义的字符串,char str_info[2][256]={“file_signal”,”Hello Linux!”},子进程1收到该信号解析内容后,以字符串数组元素1为名创建文件,在文件中输入内容为字符串数组元素2,子进程1创建和输入文件内容并关闭文件后退出,父进程收到退出信号后回收子进程1,然后发送信号给子进程2,携带信号附加信息为自定义整数x,子进程2收到信号后,复制子进程1创建的文件x份,然后退出,父进程收到子进程2退出信号后回收子进程2,并退出。要求:子进程在处理业务的同时,屏蔽SIGINT、SIGQUIT、SIGALARM信号。
时间: 2024-02-19 19:57:32 浏览: 62
父进程和子进程
这是一个比较复杂的程序,需要使用到进程、信号和文件操作,下面是一个实现该程序的参考代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>
void handle_signal(int sig, siginfo_t *siginfo, void *context) {
if (sig == SIGUSR1) {
char (*str_info)[256] = (char (*)[256])siginfo->si_value.sival_ptr;
int fd = open(str_info[0], O_CREAT | O_WRONLY, 0666);
write(fd, str_info[1], strlen(str_info[1]));
close(fd);
exit(0);
} else if (sig == SIGUSR2) {
int x = siginfo->si_int;
int fd = open("file_signal", O_RDONLY);
char buf[256];
read(fd, buf, sizeof(buf));
close(fd);
for (int i = 0; i < x; i++) {
char filename[256];
sprintf(filename, "file%d", i + 1);
fd = open(filename, O_CREAT | O_WRONLY, 0666);
write(fd, buf, strlen(buf));
close(fd);
}
exit(0);
}
}
int main() {
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = handle_signal;
sigaction(SIGUSR1, &act, NULL);
sigaction(SIGUSR2, &act, NULL);
pid_t pid1, pid2;
if ((pid1 = fork()) == 0) { // 子进程1
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGQUIT);
sigaddset(&mask, SIGALRM);
sigprocmask(SIG_BLOCK, &mask, NULL);
pause();
} else {
char str_info[2][256] = {"file_signal", "Hello Linux!"};
union sigval value;
value.sival_ptr = str_info;
sigqueue(pid1, SIGUSR1, value);
waitpid(pid1, NULL, 0);
if ((pid2 = fork()) == 0) { // 子进程2
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGQUIT);
sigaddset(&mask, SIGALRM);
sigprocmask(SIG_BLOCK, &mask, NULL);
pause();
} else {
union sigval value;
value.sival_int = 3;
sigqueue(pid2, SIGUSR2, value);
waitpid(pid2, NULL, 0);
}
}
return 0;
}
```
该程序使用了 `sigaction()` 函数来设置信号处理函数,使用了 `sigqueue()` 函数来发送信号并携带附加信息。在子进程中使用了 `sigprocmask()` 函数来屏蔽信号。在子进程1中,使用了 `pause()` 函数来等待信号,收到信号后解析附加信息,创建文件并写入内容,然后退出。在子进程2中,使用了 `pause()` 函数来等待信号,收到信号后解析附加信息,读取文件内容,创建多个文件并写入相同的内容,然后退出。在父进程中,使用了 `waitpid()` 函数来等待子进程退出,并回收资源。
阅读全文