我被困在这几天了。我必须使用fork()函数编写以下树结构。有什么建议?这就是我到目前为止所做的:
代码:
#include <stdio.h>
#include <stdlib.h>
main ()
{
int pid;
pid = fork();
//Child
if (pid == 0){
if ((pid = fork()) == 0)
{
printf("GrandChild: child pid = % d, my pid = %d, parent pid = %d \n",
pid, getpid(), getppid());
}
}
exit(0); }
树形结构:
A
B C
D E F
答案 0 :(得分:0)
以下代码应该创建您想要的树结构。每个进程分叉其子代,运行一些所需的代码,然后等待任何/所有子进程完成运行:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#define printPID printf("my pid = %d, parent pid = %d\n", getpid(), getppid());
void fork_error() {
perror("Failed to fork.");
exit(1);
}
void fork_child(void (*f)()) {
int pid;
if ((pid = fork()) == 0) {
f();
wait(NULL);
exit(0);
} else if (pid < 0) {
fork_error();
}
}
/* Function prototypes */
void A(), B(), C(), D(), E(), F();
void A() {
fork_child(B);
fork_child(C);
/* Code for A goes here */
printPID;
wait(NULL);
}
void E() {
/* Code for E goes here */
printPID;
}
void F() {
/* Code for F goes here */
printPID;
}
void C() {
fork_child(E);
fork_child(F);
/* Code for C goes here */
printPID;
}
void D() {
/* Code for D goes here */
printPID;
}
void B() {
fork_child(D);
/* Code for B goes here */
printPID;
}
int main(int argc, char *argv[]) {
A();
return 0;
}
示例输出:
$ ./a.out
my pid = 17365, parent pid = 14178
my pid = 17366, parent pid = 17365
my pid = 17369, parent pid = 17367
my pid = 17368, parent pid = 17366
my pid = 17367, parent pid = 17365
my pid = 17370, parent pid = 17367
如果在每个节点/进程中也需要子PID,则fork_child()返回一个包含子PID的int。