进程间通讯方式笔记

来源:互联网 发布:linux c debug 编辑:程序博客网 时间:2024/05/20 12:23
管道:
1,pipe是半双工的,对操作它的进程而言可以当做存在于内存中的文件。pipe()接口可创建双向管道,故可以用于进程间的通讯;
2,对于子进程使用pipe时需要close(fd[1]),否则再次从管道中read(fd[0])时会堵塞在read中,除非对读的管道专门使用fcntl(filedes[0], F_SETFL, O_NONBLOCK)设置。因为当fd[1]的引用计数大于0时,read读管道时会处于堵塞状态,等待新的数据到来,否则read会立即返回长度为0。这个处理会影响到在父进程关闭退出fd[1]后,子进程是否会被堵塞。与之类似,如果只有写入端没有读取端,向管道写入数据会收到内核传来的SIFPIPE信号。
3,popen/pclose就是先fork一个独立进程来执行指令,再使用管道通讯到shell上。但此时只能的pipe只能单项读或写。如果需要父子进程通讯,需要2组pipe配合使用。也可以配合dup/dup2。
4,socketpair可以创建类似pipe的双向通讯,但socketpair返回的是一对socket而pipe返回的是文件描述符。发散一下:socket的domain通常是AF_UNIX/AF_INET/AF_INET6/AF_NETLINK含义各不同。对type为sock_steam而言可以建立长连接,可用SO_KEEPALIVE检测另一端是否还有效。对另一端无效的连接进行读写都会触发SIGPIPE。
5, wait/waitpid使用。


信号量+共享内存:
1,信号量也是在内核中管理。可以用来进行进程同步或共享资源管理,有互斥信号量和计数信号量。
2,共享内存可以用来进行进程间的通讯或内核/用户层之间大数量的交换。通过系统调用mmap实现,mmap涉及东西比较多可以深入理解。
3,共享内存方式从读写次数上看效率最高,使用时可以直接对文件句柄进行操作或直接对固定地址进行操作。


信号:
1,进程间的异步通讯机制。新版本的信号发送函数sigqueue()及信号安装函数sigaction()可以传递附加信息。
2,可靠信号/非可靠信号;实时信号/非实时信号。unix的兼容性考虑,以32为分界线。linux中的signal()是通过sigation()数实现的。
3,对信号的处理:忽略(除SIGKILL及SIGSTOP),捕获,缺省。进程对实时信号的缺省反应是进程终止。
4,常用的发送信号接口:kill()、raise()、 sigqueue()、alarm()、setitimer()以及abort()。


消息队列:
1,最常用。有格式规范且有消息类型,比管道的纯字节流更直观。
2,消息本省随内核一起持续,由内核以链表方式管理。消息队列的大小有限制。用户层可通过系统调用创建、发送及获取状态。
0 0
原创粉丝点击