請問多層 fork() 回傳值到最頂端父層 [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊



請問多層 fork() 回傳值到最頂端父層
會員一級
註冊日期:
2014/3/5 10:26
所屬群組:
已註冊使用者
等級: 2
HP : 0 / 49
MP : 6 / 822
EXP: 97
離線
如以下程式是我拿範例加以修改完成的,註解上可能有錯也可修正。
EX 命令列上輸入 ./ex 2 3 5
表示產生2個執行層,而這兩個執行層又各自產生3個執行層,共產生8個執行層
而這8個執行層會各自取隨機數1~5,並且每經過1秒倒數-1,當倒數為0時
印出程式PID並結束。且該執行層的上一層會印出子層結束次序。

我希望在所有執行層都結束時由最頂層父層印出8個執行層順序結束的優先次序
也就是我底下寫的最後一行,不過那是失敗的,我知道原因,但不知如何修改。



另外想請問exit()功用是什麼?
已知是結束程序並回傳一個值,不結束會有BUG。

然後,也不知道底下程式EXIT()裡面的值該丟產生的亂數還是倒數中的亂數。
到底0是正常結束還是非0是正常結束?
我猜測有2種可能,丟他倒數的數並回傳,這數值一定會變成0不是0很明顯出錯了
或者丟他產生的亂數,回傳讓看的人知道哪一個亂數結束了。



#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
//By Charlotte.HonG
int main(int argv, char * args[]) {
int i,sum0[99]={0},sum[99]={0},c=0,c0=0,status=0,wpid;
printf("Parent_pid = %d\n", getpid());//印出主程式id
for (i = 0; i < atoi(args[1]); i++) {//根據輸入的數呼叫幾次產生幾層
int pid=fork(),delay = rand() % atoi(args[3]) + 1,delayF=delay;
//==========↓↓=2=↓↓==========
if (pid == 0){
while (delay > 0) {
srand(time(NULL));//產生一個亂數
printf(" ⊙ 2 <%4d> : %d", getpid(), delay--);//印出程式id,剩餘秒並遞減
if(delayF==delay+1){printf(" == First\n");}
else{printf("\n");}
sleep(1);}
int i2,sum2[99]={0},c2=0,status2=0,wpid2;
for (i = 0; i < atoi(args[2]); i++) {//根據輸入的數呼叫幾次產生幾層
int pid2=fork(),delay2 = rand() % atoi(args[3]) + 1,delay2F=delay2;
//==========↓↓=3=↓↓==========
if (pid2 == 0){
while (delay2 > 0) {
srand(time(NULL));//產生一個亂數
printf(" ⊙ 3 <%4d> : %d", getpid(), delay2--);//印出程式id,剩餘秒並遞減
if(delay2F==delay2+1){printf(" == First\n");}
else{printf("\n");}
sleep(1);}
exit(delay2F);
}
//==========↑↑=3=↑↑==========
}
while ((wpid2 = wait( & status2)) > 0) {//wait當所有程式執行完回傳0,否則回傳子程式id
printf(" ● 3 Exit status of %d was %d (%s)\n", wpid2, \
WEXITSTATUS(status2), (status2 > 0) ? "accept" : "reject");
sum0[c0] = wpid2;c0++;
sum2[c2] = wpid2;c2++;
}
if ( c2==atoi(args[2]) ){//所有子程式執行完畢之後印出順序
printf(" ※ 3 Sequence = ");
for (i = 0; i < c2; i++){//印出結束的順序
printf("%d,", sum2[i]);}
printf("\n");}
exit(delayF);
}
//==========↑↑=2=↑↑==========
}
while ((wpid = wait( & status)) > 0) {//wait當所有程式執行完回傳0,否則回傳子程式id
printf(" ● 2 Exit status of %d was %d (%s)\n", wpid, \
WEXITSTATUS(status), (status > 0) ? "accept" : "reject");
sum[c] = wpid;c++;
sum0[c0] = wpid;c0++;
}
if (c == atoi(args[1])){//所有子程式執行完畢之後印出順序
printf("※ 2 Sequence = ");
for (i = 0; i < c; i++){//印出結束的順序
printf("%d,", sum[i]);}
printf("\n");
/*printf("※ Total Sequence = ");
for (i = 0; i < atoi(args[1]) + (atoi(args[2])*atoi(args[1]) ); i++){//印出結束的順序
printf("%d,", sum0[i]);}
printf("\n");*/
}
return 0;
}

2014/4/10 20:49
應用擴展 工具箱


 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.