百度面试(进程通信、socket)

1.  进程间通信

进程间通信主要包括管道, 系统IPC(包括消息队列,信号量,共享存储), SOCKET.

  系统IPC的三种方式类同,都是使用了内核里的标识符来识别. 
    匿名管道( pipe ):匿名管道是一种半双工的通信方式,通常是在父子进程间使用。
    命名管道 (named pipe) :命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    消息队列( message queue ) : 消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
    套接字( socket ) :套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同进程间的进程通信。
FAQ1: 管道与文件描述符,文件指针的关系?
  答: 其实管道的使用方法与文件类似,都能使用read,write,open等普通IO函数. 管道描述符类似于文件描述符. 事实上, 管道使用的描述符, 文件指针和文件描述符最终都会转化成系统中SOCKET描述符. 都受到系统内核中SOCKET描述符的限制. 本质上LINUX内核源码中管道是通过空文件来实现.

FAQ2: 管道的使用方法?
  答: 主要有下面几种方法: 1)pipe, 创建一个管道,返回2个管道描述符.通常用于父子进程之间通讯. 2)popen, pclose: 这种方式只返回一个管道描述符,常用于通信另一方是stdin or stdout; 3)mkpipe: 命名管道, 在许多进程之间进行交互.

FAQ3: 管道与系统IPC之间的优劣比较?
  答: 管道: 优点是所有的UNIX实现都支持, 并且在最后一个访问管道的进程终止后,管道就被完全删除;缺陷是管道只允许单向传输或者用于父子进程之间.

  系统IPC: 优点是功能强大,能在毫不相关进程之间进行通讯; 缺陷是关键字KEY_T使用了内核标识,占用了内核资源,而且只能被显式删除,而且不能使用SOCKET的一些机制,例如select,epoll等.

FAQ4: WINDOS进程间通信与LINUX进程间通信的关系?
  答: 事实上,WINDOS的进程通信大部分移植于UNIX, WINDOS的剪贴板,文件映射等都可从UNIX进程通信的共享存储中找到影子. 

FAQ5: 进程间通信与线程间通信之间的关系?
  答: 因为WINDOWS运行的实体是线程, 狭义上的进程间通信其实是指分属于不同进程的线程之间的通讯.而单个进程之间的线程同步问题可归并为一种特殊的进程通信.它要用到内核支持的系统调用来保持线程之间同步. 通常用到的一些线程同步方法包括:Event, Mutex, 信号量Semaphore, 临界区资源等.
 

2.关于socket的write和read

百度面试中的一个问题:如果write 100字节的数据,那么读多少?

首先看这两个函数原型:

Write函数

Ssize_t write(int fd,const void*buf,size_t nbytes);

Write函数将buf中的nbytes字节内容写入到文件描述符中,成功返回写的字节数,失败返回-1.并设置errno变量。在网络程序中,当我们向套接字文件描述舒服写数据时有两种可能:

1、write的返回值大于0,表示写了部分数据或者是全部的数据,这样用一个while循环不断的写入数据,但是循环过程中的buf参数和nbytes参数是我们自己来更新的,也就是说,网络编程中写函数是不负责将全部数据写完之后再返回的,说不定中途就返回了!

2、返回值小于0,此时出错了,需要根据错误类型进行相应的处理。

如果错误是EINTR表示在写的时候出现了中断错误,如果是EPIPE表示网络连接出现了问题。

Read函数

Ssize_t read(int fd,void*buf,size_t nbyte)

Read函数是负责从fd中读取内容,当读取成功时,read返回实际读取到的字节数,如果返回值是0,表示已经读取到文件的结束了,小于0表示是读取错误。

如果错误是EINTR表示在写的时候出现了中断错误,如果是EPIPE表示网络连接出现了问题。

虽然写了100个字节,但并不能保证read一次即读100个字节,写的时候也并非写100就成功了,write和read实际成功读写的字节数由返回值确定。


				
时间: 2024-11-05 20:30:24

百度面试(进程通信、socket)的相关文章

网络中进程通信-----socket

一.什么是socket? socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",都可以用"打开open –> 读写write/read –> 关闭close"模式来操作.我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭). (1)socket()函数 int socket(int domain, int type, int protoc

Socket进程通信机制

1.Socket通常称为"套接字",用于描述IP地址和端口,是一个通信链的句柄. 2.应用程序通过套接字向网络发出请求或者应答网络请求. 3.Socket既不是一个程序,也不是一种协议,其只是操作系统提供的通信层的一组抽象API. 4.进程通信的相关概念: 网间进程通信要解决的是不同主机进程间相互通信问题.为此,首先要解决的是网间进程标识问题.同一主机上,不同进程可用唯一进程号(Process ID)标识. (1)端口:网络中可以被命名和寻址的通信端口,是操作系统可分配的一种资源,用于

linux高级编程之socket进程通信

Socket套接字不仅可以用于网络通信和局域网通信还可以用于本地的进程通信. 创建套接字时使用本地协议PF_UNIX,套接字分为流失套接字,数据报套接字. Socket本地进程通信较其他的进程间通信方式(管道,system Ⅴ,BSD)使用更加方便.效率. 本地地址结构: Struct  sockaddr_un   //<sys/un.h> { Sa_family_t sun_family; Char sun_path[108]; //套接字的文件路径 } 填充地址结构: 1.定义:struc

AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

服务器端: #include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include <sys/socket.h>#include <sys/un.h>#include <stddef.h>char buf[100];void main

Linux下进程间Socket通信调试debug方法

在一个复杂的软件系统中,往往需要有各个组件之间的数据传递,在组件间数据传递过程中,又会不可避免的出现一些小问题,这时候我们就需要来进行debug了,由于最近的一个系统使用到了collectd和rrdcached来收集数据和画图,它们之间采用了Unix socket通信,因此小小的学习了一下相关知识. 首先我们来回忆下Linux下进程通信有哪些方法: 管道(Pipe)及有名管道(FIFO)\UNIX BSD 信号(Signal) \UNIX BSD 报文消息队列(Message)\UNIX sys

百度面试android攻城狮

今天就在今天,是我的百度第二次面试,(实习生只有两次面试)我这次表现极度不好,不但没有回答好我自己的android问题,当然我的基础知识也没回答好.我怀着悲痛的心情把题目写给大家,因为面试面试的不好,所以印象深刻,所以我全能回忆起来,希望对大家有帮助!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!今天面试官,非常亲切,因为提前了一点,所以征求了我的意见,我说可以. 总共的问题分为四部分 下面详细介绍 android的 部分 1.问了我做过的一个外卖app,问了我

【朝花夕拾】一篇文章搞懂Android跨进程通信

前言 只要是面试中高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Android开发高级工程师必须要跨过的一道坎.如果您还对这方面的知识还做不到如数家珍,那就和我一起来攻克它吧! 本文主要包含了如下内容: 其行文脉络大致如下,希望能加深读者对这方面内容的记忆:(1)Android基于Linux系统,所以先说系统进程相关知识和Linux IPC.(2)总结Android的IPC

初始网络进程通信

可以这样说:我们在网络上只做一件事,利用各种软件没完没了的相互通信. 对于单机系统而言,进程在系统中有自己唯一的进程号.但在网络环境下,各主机独立分配的进程号不能唯一标识该进程.例如,主机A赋于某进程号5,在B机中也可以存在5号进程,因此,“5号进程”这句话就没有意义了.而且 操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同.因此,网间进程通信还要解决多重协议的识别问题. 为此,TCP/IP协议为网间进程通信问题建立了IP地址,端口,Socket(套接字)等概念.      (

进程通信(转)

1.定义: 进程通讯是指进程之间的信息交换. 在进程之间要传送大量数据时,就需要使用进程通讯. 进程互斥和同步需要交换一定的信息,它们也可归为进程通讯,属于低级的进程通讯.低级的原因在于 (1).效率低,生产者每次只能向缓冲池投放一个产品(消息),消费者每次只能从缓冲池中取得一个消息 (2).通讯对用户不透明,OS职位进程之间的通讯提供了共享存储其. 2.进程通讯特点: 使用方便.OS隐藏了实现进程通讯的具体细节,向用户提供了一组用于实现高级通信的命令(原语),用户可方便的直接利用它实现进程之间