TCP/IP网络编程 第十章 第十一章

第十章

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;



}

第十一章

  1. 什么是进程间通信?分别从概念和内存的角度进行说明

    概括性地说,进程间通信是指两个进程之间交换数据。但是从内存的角度看,可以理解为两个进程共有内存。因为共享的内存区域存在,可以进行数据交换

  2. 进程间通信需要特殊的IPC机制,这是由操作系统提供的。进程间通信时为何需要操作系统的帮助?

    要想实现IPC机制,需要共享的内存,但由于两个进程之间不共享内存,因此需要操作系统的帮助,也就是说,两进程共享的内存空间必须由操作系统来提供

  3. “管道”是典型的IPC技术。关于管道,请回答如下问题。

    • 管道是进程间交换数据的路径。如何创建该路径?由谁创建?

      管道是由pip函数产生的,而实际产生管道的主体是操作系统

    • 为了完成进程间通信,2个进程需同时连接管道。那2个进程如何连接到同一管道?

      pipe函数通过输入参数返回管道的输入输出文件描述符。这个文件描述符在fork函数中复制到了其子进程,因此,父进程和子进程可以同时访问同一管道。

    • 管道允许进行2个进程间的双向通信。双向通信中需要注意哪些内容?

      管道并不管理进程间的数据通信。因此,如果数据流入管道,任何进程都可以读取数据。因此,要合理安排共享空间的输入和读取

  4. 编写示例复习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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值