[英]fork tree C, child processes PID
我必須實現這張圖中的 fork樹。
+----+
+--------| P1 |---------+
/ +----+ \
/ / \ \
+----+ +----+ +----+ +----+
| P2 | | P3 | | P4 | | P5 |
+----+ +----+ +----+ +----+
/ \ / \
+----+ +----+ +----+ +----+
| P6 | | P7 | | P8 | | P9 |
+----+ +----+ +----+ +----+
|
+-----+
| P10 |
+-----+
輸出必須返回如下內容:
P1: pid: 1337 ppid: 1336 child processes pids: 1338, 1339, 1340, 1341
P2: pid: 1338 ppid: 1337 child processes pids: 1342, 1342... etc.
子進程pid是每個PX子進程的pid,我不知道該如何處理。 你能給我一些建議嗎? 到目前為止,我的代碼在下面,它正確地創建了imo樹,子進程是一個問題。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int pidp1;
int pidp2;
switch (pidp1 = fork())
{
case 0:
printf("P2: pid: %d ppid: %d\n", getpid(), getppid());
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
printf("P1: pid: %d ppid: %d child processes pids: %d\n", getpid(), getppid(), pidp1);
wait(NULL);
switch (pidp1 = fork())
{
case 0:
printf("P3: pid: %d ppid: %d\n", getpid(), getppid());
switch (pidp1 = fork())
{
case 0:
printf("P6: pid: %d ppid: %d \n", getpid(), getppid());
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
switch (pidp1 = fork())
{
case 0:
printf("P7: pid: %d ppid: %d\n", getpid(), getppid());
switch (pidp1 = fork())
{
case 0:
printf("P10: pid: %d ppid: %d\n", getpid(), getppid());
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
exit (0);
}
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
exit (0);
}
exit (0);
}
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
switch (pidp1 = fork())
{
case 0:
printf("P4: pid: %d ppid: %d\n", getpid(), getppid());
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
switch (pidp1 = fork())
{
case 0:
printf("P5: pid: %d ppid: %d\n", getpid(), getppid());
switch (pidp1 = fork())
{
case 0:
printf("P8: pid: %d ppid: %d\n", getpid(), getppid());
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
switch (pidp1 = fork())
{
case 0:
printf("P9: pid: %d ppid: %d\n", getpid(), getppid());
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
exit (0);
}
exit (0);
}
exit (0);
break;
case -1:
printf("Blad funkcji\n");
exit (1);
default:
wait(NULL);
exit (0);
}
exit (0);
}
exit (0);
}
exit (0);
}
}
看到這是家庭作業,我將嘗試為您提供一些指導。
哇,好多代碼! 這里可能有機會采用一些代碼並將其放入函數中。
您鏈接的樹看起來有些古怪(不對稱),並且從1開始計數,這很煩人。 盡管如此,我們仍可以用兩個數組來描述樹:每個進程的子代數,以及它最左邊的子代的第一個數。
/* The number of children for P0, P1, P2, P3, ... */
const int num_children[] = { -1, 4, 0, 2, 0, 2, 0, 1, 0, 0, 0 };
/* The P-number of the first child for P0, P1, P2, P3, ... */
const int first_child[] = { -1, 2, -1, 6, -1, 8, -1, 10, -1, -1, -1 };
您應該僅使用此信息就可以從圖片中重新創建樹,而無需實際查看圖片。 (真的,這樣做-我可能犯了一個錯誤。)
然后,您可以編寫一個帶有P號的函數,並執行以下操作:
num_children
多少個孩子。 first_child
查找第一個孩子的P號。 用yourfunction(1)
啟動整個過程。
葉子功能沒有子代,因此它們將永遠等待。 這意味着您的程序不再退出。 曾經 這實際上是個好消息:這意味着您可以使用ps
, pstree
和htop
類的Linux工具來確保樹的形狀正確。
(輸出行可能會以隨機順序輸出-我希望可以。)
祝好運!
您的程序不是真正可讀的。 我認為您應該開始使用結構化編程。 即
void p2() {
exit(0);
}
void p3() {
if (fork() == 0) p6();
...
exit(0);
}
void p1() {
if (fork() == 0) p2();
if (fork() == 0) p3();
...
exit(0);
}
int main() {
if (fork() == 0) p1();
wait();
...
}
如果您希望所有孩子都有一個共同的父母,那么請選擇以下代碼,而不要多次編寫fork():
int main()
{
int i, j, k;
for (i=0; i<10; i++) {
if (fork()==0) {
printf("child %d -> pid : [%d] and ppid : [%d]\n",
i+1, getpid(), getppid());
break;
} else {
if (i==0) {
printf("parent pid : [%d] \n", getpid());
}
wait(0);
}
}
return 0;
}
如果您希望讓parent-> child1-> child2即child2 parent是child1,例如此序列,請使用以下代碼:
int main()
{
int i, j, k;
for (i=0; i<10; i++) {
if (fork()==0) {
printf("child %d -> pid : [%d] and ppid : [%d]\n",
i+1, getpid(), getppid());
} else {
if (i==0) {
printf("parent pid : [%d] \n", getpid());
}
break;
}
}
return 0;
}
或者根據您的要求,您可以在循環內添加一些條件。 希望這會有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.