CS:APP 第8章 异常控制流 作业

8.9

进程对 并发?
AB
AC
AD
BC
BD
CD

8.10

A

fork

B

execvelongjmp

C

setjmp

8.11

4

8.12

8

8.13

x=4
x=3
x=2

8.14

3

8.15

5

8.16

counter = 2

8.17

三种可能性。

1
Hello
0
1
Bye
2
Bye
2
Hello
1
0
Bye
2
Bye
3
Hello
1
Bye
0
2
Bye

8.18

A,C,E

8.19

2^n

8.20

#include <unistd.h>
using namespace std;

int main(int argc, char* argv[], char* envp[])
{
    execve("/bin/ls", argv, envp);
}

不明白意义何在,练习如何使用execve么。。

8.21

abcbac

8.22

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

void unix_error(char* msg){
    fprintf(stderr, "%s : %s\n", msg, strerror(errno));
}

pid_t Fork(){
    pid_t pid;
    if((pid = fork()) < 0)
        unix_error("Fork error");
    return pid;
}

int mysystem(char* command){
    pid_t pid = Fork();
    if(pid){
        int status;
        wait(&status);
        if(WIFEXITED(status))
            return WEXITSTATUS(status);
        if(WIFSIGNALED(status))
            return WTERMSIG(status);
    }else{
        char* argv[] = {"/bin/sh", "-c", command, NULL};
        execve("/bin/sh", argv, NULL);
    }

}

int main(int argc, char* argv[], char* envp[])
{
    printf("exit code: %d\n", mysystem(argv[1]));
    fflush(stdout);
}

mac上好像ctrl+c无法触发,通过资源监视器杀进程可以触发非正常退出的分支。

8.23

信号量不会排队,当子进程给父进程发送信号时,第一个信号会被接受并且处理,第二个信号会被记录并且等待第一个信号处理完成,其他的信号都会被简单地丢弃。
所以正如教材前面所说的,不能使用信号量对其他进程中的某些东西计数。

8.24

#include "csapp.h"
#define N 2

int main(){
    int status, i;
    pid_t pid;
    /* Parent creates N children */
    for(i = 0; i < N; i++)
        if((pid = Fork()) == 0){
            int* p = 0x0;
            *p = 1;
            exit(0);
        }
    /* Parent reaps N children in no particular order */
    while((pid = waitpid(-1, &status, 0)) > 0){
        if(WIFEXITED(status))
            printf("child %d terminated normally with exit status = %d\n", pid, WEXITSTATUS(status));
        else if(WIFSIGNALED(status)){
            Sio_puts("child ");
            Sio_putl(pid);
            psignal(SIGSEGV, " terminated by signal 11");
        }
    }
    /* The only normal termination is if there are no more children */
    if(errno != ECHILD)
        unix_error("waitpid error");
    exit(0);
}
运行输出:
child 42018 terminated by signal 11: Segmentation fault
child 42019 terminated by signal 11: Segmentation fault

一开始没看懂题目意思,看懂后阅读psignal相关资料就可以完成,注意使用printf会出问题,因为printf并不是安全的,这里使用的是SioputsSioputl,也可以使用sprintf先写到缓冲区然后利用psignal进行输出。

8.25

#include "csapp.h"

sigjmp_buf buf;

void sigchld_handler(int sig){
    siglongjmp(buf, 1);
}

char* tfgets(char* str){
    if(sigsetjmp(buf, 1))
        return NULL;
    pid_t pid;
    if(signal(SIGCHLD, sigchld_handler) == SIG_ERR)
        unix_error("set SIGCHLD error");
    if((pid = Fork()) == 0){
        sleep(5);
        exit(0);    
    }else{
        return gets(str);
    }
}

int main(){
    char buf[256];
    puts(tfgets(buf));
}

首先得开一个子进程对五秒时间进行计数,如果子进程成功返回说明超时应该返回NULL,不然直接返回gets的结果就行。
所以父进程应该直接调用gets满足不超时的情况,问题在于超时后父进程捕捉到子进程结束时的仍在等待gets,而signal handler只能返回到当前指令无法对流程进行控制,这时候就应该使用非本地跳转返回到注册地进行处理。
理论上感觉goto也是可以的,由于实用性不高没有进行尝试。

8.26

其实就是shell lab,等待完成中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 异常控制流 系统需要能够对系统状态的改变做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定和程序的执行相...
    Cool_Pomelo阅读 664评论 0 5
  • 异常 当处理器检测到有事件发生时,他就会通过一张叫做异常表的跳转表,进行一个间接的过程调用,转到专门用于处理这类事...
    userheng阅读 412评论 0 0
  • 8.1 引言 在理解线程之前,首先需要了解UNIX/Linux进程。 进程是由操作系统创建的,需要相当数量的“开销...
    MachinePlay阅读 394评论 0 0
  • 一、Linux系统概述 不加引号可理解为宏,直接替换,单引号中特殊字符会被解释为普通字符,双引号中$,,'还是特殊...
    赤果_b4a7阅读 1,502评论 0 2
  • 摘 要 为了对计算机系统有着更深入的了解以及研究系统间的协作关系。本大作业针对hello程序运行的一系列过程对c...
    icey_J阅读 472评论 0 0