操作系统第五章课后作业节选

写在前面的话:本次课程作业其实就是对于书上第五章内容的改写,估计是书的作者想让我们体验一下实践的过程吧。

目录

5.1

1.1 题目描述

 1.2  代码样例

1.3 运行结果

5.3

3.1 题目描述 

3.2 代码样例

3.3 运行结果

5.5

5.1 题目描述

5.2 代码样例

5.3 运行结果

5.4 代码样例

5.5 运行结果

5.7

7.1 题目描述

7.2 代码样例

7.3 运行结果


5.1

1.1 题目描述

 1.2  代码样例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int
main(int argc, char *argv[])
{
    printf("hello world (pid:%d)\n", (int) getpid());
    int x=3208;
    int rc = fork();
    if (rc < 0) { // fork failed; exit 
    fprintf(stderr, "fork failed\n");
    exit(1);
    } else if (rc == 0) { // child (new process) 
           x=4396;
           printf("hello, I am child (pid:%d)\n, x=%d\n", (int) getpid(),x);
    } else { // parent goes down this path (main) 
           x=2200;
           printf("hello, I am parent of %d (pid:%d)\n, x=%d\n", rc, (int) getpid(),x);
    }
    return 0;
}

1.3 运行结果

5.3

3.1 题目描述 

3.2 代码样例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int
main(int argc, char *argv[])
{
    printf("hello world (pid:%d)\n", (int) getpid());
    int rc = fork();
    if (rc < 0) { // fork failed; exit 
    fprintf(stderr, "fork failed\n");
    exit(1);
    } else if (rc == 0) { // child (new process) 
           printf("hello, I am child (pid:%d)\n", (int) getpid());
           printf("hello\n");
    } else { // parent goes down this path (main)
           int wc = wait(NULL);
           printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc,wc, (int) getpid());
           printf("goodbye\n");
    }
    return 0;
}

3.3 运行结果

 如果不使用wait(),可以使用signal()函数和alarm()函数结合使用,在父进程中设置一个定时器,当定时器时间到时,向父进程发送一个信号,父进程捕获信号就可以开始打印goodbye。

以下是代码样例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void sig_handler(int signum) {
    printf("goodbye from parent\n");
    exit(EXIT_SUCCESS);
}

int main() {
    signal(SIGALRM, sig_handler); // 注册信号处理程序

    pid_t pid = fork();

    if (pid < 0) {
        fprintf(stderr, "fork failed\n");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        // child process
        printf("hello from child\n");
        exit(EXIT_SUCCESS);
    } else {
        // parent process
        alarm(1); // 设置定时器
        while(1); // 父进程进入一个无限循环,直到接收到信号
    }

    return 0;
}

运行结果:

5.5

5.1 题目描述

5.2 代码样例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int
main(int argc, char *argv[])
{
    printf("hello world (pid:%d)\n", (int) getpid());
    int rc = fork();
    if (rc < 0) { // fork failed; exit 
    fprintf(stderr, "fork failed\n");
    exit(1);
    } else if (rc == 0) { // child (new process) 
           printf("hello, I am child (pid:%d)\n", (int) getpid());
    } else { // parent goes down this path (main)
           int wc = wait(NULL);
           printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc,wc, (int) getpid());
           printf("wait() return: %d\n",(int) wc);
    }
    return 0;
}

5.3 运行结果

在父进程中调用wait()时,会返回子进程的PID; 

5.4 代码样例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int
main(int argc, char *argv[])
{
    printf("hello world (pid:%d)\n", (int) getpid());
    int rc = fork();
    if (rc < 0) { // fork failed; exit 
    fprintf(stderr, "fork failed\n");
    exit(1);
    } else if (rc == 0) { // child (new process) 
           int wc= wait(NULL);
           printf("hello, I am child (pid:%d)\n", (int) getpid());
           printf("wait() return: %d\n",(int) wc);
    } else { // parent goes down this path (main)
           printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
    }
    return 0;
}

5.5 运行结果

在子进程中调用wait()时,会返回-1;

5.7

7.1 题目描述

 

7.2 代码样例

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

int
main(int argc, char *argv[])
{
    printf("hello world (pid:%d)\n", (int) getpid());
    int rc = fork();
    if (rc < 0) { // fork failed; exit 
    fprintf(stderr, "fork failed\n");
    exit(1);
    } else if (rc == 0) { // child (new process) 
           close(STDOUT_FILENO);
           printf("hello, I am child (pid:%d)\n", (int) getpid());
    } else { // parent goes down this path (main)
           int wc=wait(NULL);
           printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
    }
    return 0;
}

7.3 运行结果

 

 可以看到此时子进程不会有任何输出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值