8.9
进程对 | 并发的? |
---|---|
AB | 否 |
AC | 是 |
AD | 是 |
BC | 是 |
BD | 是 |
CD | 是 |
8.10
A : fork
B : execve
C : longjmp, setjmp
8.11
4个。
8.12
8个。
8.13
x=4
x=3
x=2
8.14
3个。
8.15
5个。
8.16
2
8.17
略
8.18
E
8.19
2 n 2^n 2n
8.20
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char* argv[], char* envp[])
{
execve("/bin/ls", argv, envp);
exit(0);
}
8.21
abcc
8.22
extern char **environ;
int mysystem(char* command)
{
int ret;
int pid = fork();
if(pid==0){
char *argv[] = {"/bin/sh", "-c", NULL, NULL};
char *envp[] = {NULL};
argv[2] = command;
execve("/bin/sh", argv, environ);
}
else{
waitpid(-1, &ret, 0);
}
return WEXITSTATUS(ret);
}
8.23
父进程不能及时处理子进程发送的信号,而同种信号不会排队,只会被丢弃。
8.24
const char CONSTANT = 'c';
int main()
{
int status, i;
pid_t pid;
for (i = 0; i < N;i++){
if((pid=fork())==0){
scanf("%c", &CONSTANT);
exit(100 + i);
}
}
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));
fflush(stdout);
psignal(WTERMSIG(status), NULL);
}
}
exit(0);
}
8.25
jmp_buf buf;
void tfgets_handler()
{
siglongjmp(buf, 1);
}
char *tfgets(char *Buffer, int _MaxCount, FILE *_Stream)
{
signal(SIGALRM, tfgets_handler);
if(sigsetjmp(buf, 1)==0){
alarm(5);
fgets(Buffer, _MaxCount, _Stream);
}
else
return NULL;
signal(SIGALRM, SIG_DFL);
return Buffer;
}