第十章
1 下列关于进程的说法错误的是?
.bc 进程通过返回值确定父子关系 ,进程是计算机资源分配的最小资源单位
2 错误的是?
.cd 父子进程遵循读时共享,写时复制的原则 fork()后的子进程执行if判断pid==0的代码段
3.
#include<stdio.h>
#include<sys/socket.h>
#include<unistd.h>
int main(){
int sock;
sock=socket(PF_INET,SOCK_STREAM,0);
pid_t pid;
pid=fork();
if(pid==0){
printf("child process sockfd: %d\n",sock);
}else if(pid>0){
printf("parent process sockfd: %d\n",sock);
}else if(pid<0){
printf("fork() error");
}
return 0;
}
4.请说明进程变为僵尸进程的过程及预防措施
僵尸进程是子进程,在子进程结束的时候,其返回值会被传到操作系统,直到该返回值被父进程接受为止,此前该子进程一直为僵尸进程存在,为了防止这种情况 用wait/waitpid来处理子进程结束的返回值
5.
#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
void zombine_handler(int sig){
char ret;
fputs("Do you want to exit(q to quit)\n",stdout);
scanf("%c",&ret);
if(ret=='q')
exit(1);
}
int main(){
struct sigaction act;
int ret;
act.sa_handler=zombine_handler;
act.sa_flags=0;
sigemptyset(&act.sa_mask);
sigaction(SIGINT,&act,0);
for(;;){
sleep(1);
printf("hello world!\n");
}
return 0;
}
第十一章
-
什么是进程间通信?分别从概念和内存的角度进行说明
概括性地说,进程间通信是指两个进程之间交换数据。但是从内存的角度看,可以理解为两个进程共有内存。因为共享的内存区域存在,可以进行数据交换
-
进程间通信需要特殊的IPC机制,这是由操作系统提供的。进程间通信时为何需要操作系统的帮助?
要想实现IPC机制,需要共享的内存,但由于两个进程之间不共享内存,因此需要操作系统的帮助,也就是说,两进程共享的内存空间必须由操作系统来提供
-
“管道”是典型的IPC技术。关于管道,请回答如下问题。
-
管道是进程间交换数据的路径。如何创建该路径?由谁创建?
管道是由pip函数产生的,而实际产生管道的主体是操作系统
-
为了完成进程间通信,2个进程需同时连接管道。那2个进程如何连接到同一管道?
pipe函数通过输入参数返回管道的输入输出文件描述符。这个文件描述符在fork函数中复制到了其子进程,因此,父进程和子进程可以同时访问同一管道。
-
管道允许进行2个进程间的双向通信。双向通信中需要注意哪些内容?
管道并不管理进程间的数据通信。因此,如果数据流入管道,任何进程都可以读取数据。因此,要合理安排共享空间的输入和读取
-
-
编写示例复习IPC技术,使2个进程相互交换3次字符串…
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> #define BUF_SIZE 30 int main(int argc, char *argv[]) { int fds1[2], fds2[2]; char str1[]="Do you like coffee?"; char str2[]="I like coffee"; char str3[]="I like bread"; char * str_arr[]={str1, str2, str3}; char buf[BUF_SIZE]; pid_t pid; int i; pipe(fds1), pipe(fds2); pid=fork(); if(pid==0) { for(i=0; i<3; i++) { write(fds1[1], str_arr[i], strlen(str_arr[i])+1); read(fds2[0], buf, BUF_SIZE); printf("Child proc output: %s \n", buf); } } else { for(i=0; i<3; i++) { read(fds1[0], buf, BUF_SIZE); printf("Parent proc output: %s \n", buf); write(fds2[1], str_arr[i], strlen(str_arr[i])+1); } } return 0; }