同一接口不同的数据源:

协同进程:

fdopen以文件描述符为参数:

fopen和popen:

为了实现popen,必须在子进程中调用sh,因为只有shell本身即/bin/sh可以运行任意shell命令:

popen的实现:

访问数据:

系统调用socket创建一个socket:

 

htons(16位)、htonl(32位)、ntohs、ntohl这些函数用于网络字节序与主机字节序转换。名字由来:host to network long。

connect:

使用SIGCHLD来阻止僵尸问题:

到前面的章节补一下signal调用:

waitpid提供了wait函数超集的功能:

但是不知道上面waitpid第二个参数是指向整型值的指针,只有一个值而不是多个值。???

HTTP请求和应答:

http服务器处理请求:

 许可证服务器。

一个通信系统的例子:

TCP和UDP的比较:

数据报socket使用sendto和recvfrom。

get_internet_address函数:

服务端通过recvfrom可得客户端的IP信息:

分布式许可证系统方案:

Unix域文件名作为socket地址:

使用多线程的实例:

互斥锁:

线程和fork进程一些差别:

互斥锁和条件变量:

创建不需返回的独立线程:

select系统调用:

其中,readfds的类型为fd_set。

select调用示例中的showdata函数:

其中fd_set据说是以位图实现的:

#define __NFDBITS (8 * sizeof(unsigned long))                //每个ulong型可以表示多少个bit,
#define __FD_SETSIZE 1024 //socket最大取值为1024
#define __FDSET_LONGS (__FD_SETSIZE/__NFDBITS) //bitmap一共有1024个bit,共需要多少个ulong typedef struct {
unsigned long fds_bits [__FDSET_LONGS]; //用ulong数组来表示bitmap
} __kernel_fd_set; typedef __kernel_fd_set fd_set; 对应的操作:
//每个ulong为32位,可以表示32个bit。
//fd >> 5 即 fd / 32,找到对应的ulong下标i;fd & 31 即fd % 32,找到在ulong[i]内部的位置 #define __FD_SET(fd, fdsetp) (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] |= (1<<((fd) & 31))) //设置对应的bit
#define __FD_CLR(fd, fdsetp) (((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] &= ~(1<<((fd) & 31))) //清除对应的bit
#define __FD_ISSET(fd, fdsetp) ((((fd_set *)(fdsetp))->fds_bits[(fd) >> 5] & (1<<((fd) & 31))) != 0) //判断对应的bit是否为1
#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof (*(fd_set *)(fdsetp)))) //memset bitmap

命名管道FIFO:

IPC方法之三共享内存(前二就是前面的文件管道):

IPC方法之三共享内存示例:

其中示例用到的部分函数没有在本书中解释:

int shmdt(const void *shmaddr)   //(断开共享内存连接)

int shmctl(int shmid, int cmd, struct shmid_ds *buf)   //(共享内存管理)

函数传入值
shmid
共享内存标识符
cmd
IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
IPC_RMID:删除这片共享内存
buf
共享内存管理结构体。具体说明参见共享内存内核结构定义部分

注:在QT中码了一个使用共享内存的实例,其中myIPC使用共享内存,并加载图片到其中,在sharedMemoryTest中访问该共享内存并显示先前加载的图片,主要相关代码如下:

myIPC相关代码:
sharedMemory.setKey("QSharedMemoryExample");
……
sharedMemory.lock();
char *to=(char*) sharedMemory.data();
const char *from=buffer.data().data();
memcpy(to,from,qMin(sharedMemory.size(),size));
sharedMemory.unlock();
sharedMemory.detach();

sharedMemoryTest相关代码:
sharedMemory.setKey("QSharedMemoryExample"); 
sharedMemory.lock();
buffer.setData((char*)sharedMemory.constData(),sharedMemory.size());
buffer.open(QBuffer::ReadOnly); in>>image; sharedMemory.unlock();
sharedMemory.detach();

QT这里共享内存的setKey函数参数为字符串,这不同于前面说的整型数,不知道会不会最后关联到一个整型数。

使用文件锁进行编程:

使用文件锁进行编程示例:

使用信号量:

使用信号量示例:

纵观IPC:

Unix/Linux编程实践教程(二:socket、多线程、进程间通信)的更多相关文章

  1. 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述

    0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...

  2. Unix/Linux编程实践教程(0:文件、终端、信号)

    本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下. 阅读联机帮助的一个示例: open系统调用: read系统调用: Unix的time: 上面的printf可以 ...

  3. Unix/Linux编程实践教程(一:进程、管道)

    execvp在程序中启动新程序: 用fork创建新进程: forkdemo2代码: 测试fork的时候参考<Linux权威指南>阅读笔记(3)  使用了patch: [root@local ...

  4. Unix/Linux编程实践教程(三:代码、测试)

    测试logfilec.c的时候,有个sendto(sock,msg,strlen(msg),0,&addr,addrlen),编译时提示: logfilec.c:30: warning: pa ...

  5. 学习《Unix/Linux编程实践教程》(2):实现 more

    0.目录 1.more 能做什么? 2.more 是如何实现的? 3.实现 more 3.1 more01.c 3.2 more02.c 3.3 more03.c 1.more 能做什么? more ...

  6. C#编程总结(二)多线程基础

    C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...

  7. 【Linux/unix网络编程】之使用socket进行TCP编程

    实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...

  8. Unix Linux 编程书籍

    UNIX环境高级编程(第3版) Advanced Programming in the UNIX Environment Linux/UNIX系统编程手册 Linux/UNIX系统编程手册 (豆瓣) ...

  9. 项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】

    在第一篇文章 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]发布后,根据大家的回复,我需要向大家说明几个问题: 1.为什么要用VisualSVN Server,而不用Subver ...

随机推荐

  1. 电量显示Binding Converter MVVM

    用一个ProcessBar显示电量,低于20%时候,ForeGround为红色,否则为绿色, 页面使用了MVVM绑定到了ViewModel, ProcessBar XAML为 <Progress ...

  2. python判断类型

    方法 isinstance(obj, type) 示例 >>> print isinstance(, int) True >>> print isinstance( ...

  3. D3D9 GPU Hacks (转载)

    D3D9 GPU Hacks I’ve been trying to catch up what hacks GPU vendors have exposed in Direct3D9, and tu ...

  4. Velocity(2)——引用

    在Velocity Template Language(VTL)中,有三种类型的引用:变量,属性,方法.所有的引用都被看作是字符串,如果某个引用是一个整型值,velocity会调用它的toString ...

  5. java提高篇(九)-----详解匿名内部类

    在java提高篇-----详解内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始 ...

  6. J2EE sitemesh使用

    maven包含sitemesh: <dependency> <groupId>opensymphony</groupId> <artifactId>si ...

  7. Applescript 带参数调用某个App的方法

    do shell script "open '/Users/eran/Documents/Workground/DragonAdventure/FlashCode/tools/SWFInfo ...

  8. C#: MessageBox

    系统学习下Form里用到最多的MessageBox MessageBox有21个重载的Show函数...都是返回DialogResult public enum DialogResult { None ...

  9. URAL 1002 Phone Numbers(KMP+最短路orDP)

    In the present world you frequently meet a lot of call numbers and they are going to be longer and l ...

  10. 夺命雷公狗---微信开发62----所以memcache对access_token进行全局缓存优化

    公众号调用接口并不是无限制的,为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下, 每个公众号调用接口都不能超过一定限制,当超过一定限制时,调用对应接口会收到错误信息,造成调用失败. 我们也 ...