多进程编程习题

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.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值