Quiz:在Linux中用c语言实现:父进程fork3个子进程,3个子进程一个调用ps命令,一个调用自定义程序1(正常),一个调用自定义程序2(会出现段错误)。父进程使用waitpid对子进程进行回收。
以下是一个在Linux中使用C语言实现父进程fork三个子进程的示例代码。其中,一个子进程调用ps
命令,一个子进程调用自定义程序1(正常执行),另一个子进程调用自定义程序2(会导致段错误)。父进程使用waitpid
函数等待子进程并进行回收。
quiz.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid[3];
int status;
// Fork three child processes
for (int i = 0; i < 3; i++) {
pid[i] = fork();
if (pid[i] == 0) {
// Child process
if (i == 0) {
// Child process 1: Call "ps" command
execlp("ps", "ps", NULL);
} else if (i == 1) {
// Child process 2: Call custom program 1
execl("./custom_program_1", "custom_program_1", NULL);
} else if (i == 2) {
// Child process 3: Call custom program 2 (causing segmentation fault)
execl("./custom_program_2", "custom_program_2", NULL);
}
exit(0);
}
}
// Parent process
for (int i = 0; i < 3; i++) {
// Wait for child process to terminate
waitpid(pid[i], &status, 0);
if (WIFEXITED(status)) {
printf("Child process %d terminated with exit status: %d\n", i+1, WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("Child process %d terminated due to signal: %d\n", i+1, WTERMSIG(status));
}
}
return 0;
}
./custom_program_1.c
#include <stdio.h>
int main() {
printf("This is custom program 1.\n");
return 0;
}
./custom_program_2.c
#include <stdio.h>
int main() {
int* ptr = NULL;
printf("This is custom program 2.\n");
printf("Dereferencing NULL pointer: %d\n", *ptr);
return 0;
}