多進程編程習題

1.循環創建100個子進程

fork.c

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

int main(){
    int i;
    int num = 1;
    pid_t pid = getpid();
    for(i = 0; i < 100; ++i){
        pid_t childpid = fork();
        if(childpid < 0){
            printf("fork error\n");
        }
        if(childpid == 0){
            break;
        }else{
            ++num;
        }
    }
    if(getpid() == pid){
        printf("I'm parent progress %d\n", getpid());
    }else{
        printf("I'm %d child progress %d\n", num, getpid());
    }
    return 0;    
}

解釋:由於沒有做進程同步,所以進程的調用順序是隨機的,但保證創建了100個子進程。(子進程不會繼續執行循環,而是會break,父進程會繼續進行循環)

運行結果:

在這裏插入圖片描述

out1.txt

I'm 7 child progress 7325
I'm 6 child progress 7324
I'm 8 child progress 7326
I'm 5 child progress 7323
I'm 9 child progress 7327
I'm 10 child progress 7328
I'm 11 child progress 7329
I'm 4 child progress 7322
I'm 12 child progress 7330
I'm 13 child progress 7331
I'm 14 child progress 7332
I'm 3 child progress 7321
I'm 15 child progress 7333
I'm 16 child progress 7334
I'm 17 child progress 7335
I'm 20 child progress 7338
I'm 25 child progress 7343
I'm 27 child progress 7345
I'm 21 child progress 7339
I'm 24 child progress 7342
I'm 29 child progress 7347
I'm 18 child progress 7336
I'm 26 child progress 7344
I'm 28 child progress 7346
I'm 30 child progress 7348
I'm 19 child progress 7337
I'm 22 child progress 7340
I'm 23 child progress 7341
I'm 31 child progress 7349
I'm 32 child progress 7350
I'm 33 child progress 7351
I'm 2 child progress 7320
I'm 34 child progress 7352
I'm 35 child progress 7353
I'm 36 child progress 7354
I'm 37 child progress 7355
I'm 38 child progress 7356
I'm 39 child progress 7357
I'm 40 child progress 7358
I'm 41 child progress 7359
I'm 42 child progress 7360
I'm 43 child progress 7361
I'm 44 child progress 7362
I'm 45 child progress 7363
I'm 46 child progress 7364
I'm 47 child progress 7365
I'm 1 child progress 7319
I'm 48 child progress 7366
I'm 49 child progress 7367
I'm 50 child progress 7368
I'm 51 child progress 7369
I'm parent progress 7318
I'm 58 child progress 7376
I'm 59 child progress 7377
I'm 60 child progress 7378
I'm 57 child progress 7375
I'm 61 child progress 7379
I'm 62 child progress 7380
I'm 63 child progress 7381
I'm 64 child progress 7382
I'm 56 child progress 7374
I'm 65 child progress 7383
I'm 66 child progress 7384
I'm 67 child progress 7385
I'm 68 child progress 7386
I'm 69 child progress 7387
I'm 55 child progress 7373
I'm 70 child progress 7388
I'm 72 child progress 7390
I'm 73 child progress 7391
I'm 74 child progress 7392
I'm 75 child progress 7393
I'm 71 child progress 7389
I'm 76 child progress 7394
I'm 77 child progress 7395
I'm 78 child progress 7396
I'm 54 child progress 7372
I'm 79 child progress 7397
I'm 80 child progress 7398
I'm 81 child progress 7399
I'm 82 child progress 7400
I'm 93 child progress 7411
I'm 95 child progress 7413
I'm 84 child progress 7402
I'm 90 child progress 7408
I'm 96 child progress 7414
I'm 97 child progress 7415
I'm 87 child progress 7405
I'm 86 child progress 7404
I'm 88 child progress 7406
I'm 92 child progress 7410
I'm 100 child progress 7418
I'm 98 child progress 7416
I'm 85 child progress 7403
I'm 89 child progress 7407
I'm 83 child progress 7401
I'm 91 child progress 7409
I'm 94 child progress 7412
I'm 99 child progress 7417
I'm 53 child progress 7371
I'm 52 child progress 7370

2.請編寫程序創建子進程並令其掛起100s,令父進程每秒監測子進程狀態,若子進程死亡則打印“子進程死亡”,否則打印“Hello World!”

daemon.c

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <string.h>
#include <time.h>

void printTime() {
    time_t calendar_time = time(NULL);
    struct tm * tm_local = localtime(&calendar_time);
    char str_f_t [50];
    strftime(str_f_t, sizeof(str_f_t), "%G-%m-%d %H:%M:%S", tm_local);
    printf("%s ", str_f_t);
}
int main(){
    int status, w;
    pid_t pid = fork();
    if(pid < 0){
        printf("fork error\n");
        return 0;
    }
    if(pid == 0){
        printf("I'm child progress %d\n", getpid());
        sleep(100);
    }else{
        while(1){
            w = waitpid(pid, &status, WNOHANG);
            if (w == 0) {
                printTime();
                printf("Child PID=%d Hello World\n", pid);
            } else {
                printTime();
                printf("Child PID=%d has been killed.\n", pid);
                break;
            }
            sleep(1);
        }
    }
    return 0;
}

解釋:

waitpid函數第三個參數設置爲WNOHANG時,如果子進程正在運行,則返回0,如果子進程已經結束,則會返回子進程的pid

運行結果:

在這裏插入圖片描述

out2.txt

2020-04-14 15:55:38 Child PID=7719 Hello World
2020-04-14 15:55:39 Child PID=7719 Hello World
2020-04-14 15:55:40 Child PID=7719 Hello World
2020-04-14 15:55:41 Child PID=7719 Hello World
2020-04-14 15:55:42 Child PID=7719 Hello World
2020-04-14 15:55:43 Child PID=7719 Hello World
2020-04-14 15:55:44 Child PID=7719 Hello World
2020-04-14 15:55:45 Child PID=7719 Hello World
2020-04-14 15:55:46 Child PID=7719 Hello World
2020-04-14 15:55:47 Child PID=7719 Hello World
2020-04-14 15:55:48 Child PID=7719 Hello World
2020-04-14 15:55:49 Child PID=7719 Hello World
2020-04-14 15:55:50 Child PID=7719 Hello World
2020-04-14 15:55:51 Child PID=7719 Hello World
2020-04-14 15:55:52 Child PID=7719 Hello World
2020-04-14 15:55:53 Child PID=7719 Hello World
2020-04-14 15:55:54 Child PID=7719 Hello World
2020-04-14 15:55:55 Child PID=7719 Hello World
2020-04-14 15:55:56 Child PID=7719 Hello World
2020-04-14 15:55:57 Child PID=7719 Hello World
2020-04-14 15:55:58 Child PID=7719 Hello World
2020-04-14 15:55:59 Child PID=7719 Hello World
2020-04-14 15:56:00 Child PID=7719 Hello World
2020-04-14 15:56:01 Child PID=7719 Hello World
2020-04-14 15:56:02 Child PID=7719 Hello World
2020-04-14 15:56:03 Child PID=7719 Hello World
2020-04-14 15:56:04 Child PID=7719 Hello World
2020-04-14 15:56:05 Child PID=7719 Hello World
2020-04-14 15:56:06 Child PID=7719 Hello World
2020-04-14 15:56:07 Child PID=7719 Hello World
2020-04-14 15:56:08 Child PID=7719 Hello World
2020-04-14 15:56:09 Child PID=7719 Hello World
2020-04-14 15:56:10 Child PID=7719 Hello World
2020-04-14 15:56:11 Child PID=7719 Hello World
2020-04-14 15:56:12 Child PID=7719 Hello World
2020-04-14 15:56:13 Child PID=7719 Hello World
2020-04-14 15:56:14 Child PID=7719 Hello World
2020-04-14 15:56:15 Child PID=7719 Hello World
2020-04-14 15:56:16 Child PID=7719 Hello World
2020-04-14 15:56:17 Child PID=7719 Hello World
2020-04-14 15:56:18 Child PID=7719 Hello World
2020-04-14 15:56:19 Child PID=7719 Hello World
2020-04-14 15:56:20 Child PID=7719 Hello World
2020-04-14 15:56:21 Child PID=7719 Hello World
2020-04-14 15:56:22 Child PID=7719 Hello World
2020-04-14 15:56:23 Child PID=7719 Hello World
2020-04-14 15:56:24 Child PID=7719 Hello World
2020-04-14 15:56:25 Child PID=7719 Hello World
2020-04-14 15:56:26 Child PID=7719 Hello World
2020-04-14 15:56:27 Child PID=7719 Hello World
2020-04-14 15:56:28 Child PID=7719 Hello World
2020-04-14 15:56:29 Child PID=7719 Hello World
2020-04-14 15:56:30 Child PID=7719 Hello World
2020-04-14 15:56:31 Child PID=7719 Hello World
2020-04-14 15:56:32 Child PID=7719 Hello World
2020-04-14 15:56:33 Child PID=7719 Hello World
2020-04-14 15:56:34 Child PID=7719 Hello World
2020-04-14 15:56:35 Child PID=7719 Hello World
2020-04-14 15:56:36 Child PID=7719 Hello World
2020-04-14 15:56:37 Child PID=7719 Hello World
2020-04-14 15:56:38 Child PID=7719 Hello World
2020-04-14 15:56:39 Child PID=7719 Hello World
2020-04-14 15:56:40 Child PID=7719 Hello World
2020-04-14 15:56:41 Child PID=7719 Hello World
2020-04-14 15:56:42 Child PID=7719 Hello World
2020-04-14 15:56:43 Child PID=7719 Hello World
2020-04-14 15:56:44 Child PID=7719 Hello World
2020-04-14 15:56:45 Child PID=7719 Hello World
2020-04-14 15:56:46 Child PID=7719 Hello World
2020-04-14 15:56:47 Child PID=7719 Hello World
2020-04-14 15:56:48 Child PID=7719 Hello World
2020-04-14 15:56:49 Child PID=7719 Hello World
2020-04-14 15:56:50 Child PID=7719 Hello World
2020-04-14 15:56:51 Child PID=7719 Hello World
2020-04-14 15:56:52 Child PID=7719 Hello World
2020-04-14 15:56:53 Child PID=7719 Hello World
2020-04-14 15:56:54 Child PID=7719 Hello World
2020-04-14 15:56:55 Child PID=7719 Hello World
2020-04-14 15:56:56 Child PID=7719 Hello World
2020-04-14 15:56:57 Child PID=7719 Hello World
2020-04-14 15:56:58 Child PID=7719 Hello World
2020-04-14 15:56:59 Child PID=7719 Hello World
2020-04-14 15:57:00 Child PID=7719 Hello World
2020-04-14 15:57:01 Child PID=7719 Hello World
2020-04-14 15:57:02 Child PID=7719 Hello World
2020-04-14 15:57:03 Child PID=7719 Hello World
2020-04-14 15:57:04 Child PID=7719 Hello World
I'm child progress 7719
2020-04-14 15:57:05 Child PID=7719 Hello World
2020-04-14 15:57:06 Child PID=7719 Hello World
2020-04-14 15:57:07 Child PID=7719 Hello World
2020-04-14 15:57:08 Child PID=7719 Hello World
2020-04-14 15:57:09 Child PID=7719 Hello World
2020-04-14 15:57:10 Child PID=7719 Hello World
2020-04-14 15:57:11 Child PID=7719 Hello World
2020-04-14 15:57:12 Child PID=7719 Hello World
2020-04-14 15:57:13 Child PID=7719 Hello World
2020-04-14 15:57:14 Child PID=7719 Hello World
2020-04-14 15:57:15 Child PID=7719 Hello World
2020-04-14 15:57:16 Child PID=7719 Hello World
2020-04-14 15:57:17 Child PID=7719 Hello World
2020-04-14 15:57:18 Child PID=7719 has been killed.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章