請問多層 fork() 回傳值到最頂端父層 [論壇 - Ubuntu 程式設計]
正在瀏覽:
1 名遊客
請問多層 fork() 回傳值到最頂端父層 |
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
會員一級
![]() ![]() 註冊日期:
2014/3/5 10:26 所屬群組:
已註冊使用者 等級: 2
HP : 0 / 49
![]() |
如以下程式是我拿範例加以修改完成的,註解上可能有錯也可修正。
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
|
||||||||||
![]() |
您可以查看帖子.
您不可發帖.
您不可回覆.
您不可編輯自己的帖子.
您不可刪除自己的帖子.
您不可發起投票調查.
您不可在投票調查中投票.
您不可上傳附件.
您不可不經審核直接發帖.