家庭作业(整理)

家庭作业 20135336-王维臻

2.60

unsigned replace_byte(unsigned x, unsigned char b, int i)
{
return (x & ~(0xFF<<(i<<3))) | (b << (i<<3));
}

8.17举例练习题8.4中程序所有可能的输出。

当程序满足

Hello--->1->Bye

  \        \    

   \--->0---->2-->Bye

这种拓扑即可输出。

情况一:

Hello

1

Bye

0

2

Bye

情况二:

Hello

1

0

Bye

2

Bye

情况三:

Hello

0

1

Bye

2

Bye

8.24修改图8-17中的程序,以满足下面两个条件:

1.每个子进程在试图写一个只读文本段中的位置时会异常终止。

2.父进程打印和下面所示相同(除PID)的输出:

child 12255 terminated by signal 11: Segmentation fault

child 12254 terminated by signal 11: Segmentation fault

`#include "csapp.h"
 #define N 2int main()
{
     int status, i;
     pid_t pid;
     char errorInfo[128];
     /* Parent creates N children */
 for(i=0;i<N;i++)
    if ((pid = Fork()) == 0) /* Child */
        exit(100+i);

/* 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))
    {
      printf("child %d terminated by signal %d: ", 
            pid, WTERMSIG(status) );
        psignal(WTERMSIG(status), errorInfo); //psignal会打印sig的信息
    }
}
/* The only normal termination is if there are no more children */
if (errno != ECHILD)
    unix_error("waitpid error");
exit(0);
}

8.25编写fgets函数的一个版本,叫做tfgets,它5秒过后会超时。tfgets函数接收和fgets相同的输入。如果用户在5秒内不键入一个输入行,tfgets返回NULL。否则,它返回一个指向输入行的指针。

fgets的定义如下:

char fgets(char buf, int bufsize, FILE *stream);

参数:

*buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明buf指向的字符数组的大小。

*stream: 文件结构体指针,将要读取的文件流。

`#include <stdio.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
 #include <signal.h>
 #include <setjmp.h>

sigjmp_buf env;
void tfgets_handler(int sig)
{
signal(SIGALRM, SIG_DFL);
siglongjmp(env, 1);
}

char *tfgets(char *buf, int bufsize, FILE *stream)
{
     static const int TimeLimitSecs = 5;
     signal(SIGALRM, tfgets_handler)
     alarm(TimeLimitSecs);
     int rc = sigsetjmp(env, 1);
     if(rc == 0) return fgets(buf, bufsize, stream);
     else return NULL; //alarm,time out
}`

汇总

王维臻:10分

你可能感兴趣的:(家庭作业(整理))