Unix/Linux编程实践教程(二:socket、多线程、进程间通信)
同一接口不同的数据源:

协同进程:

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、多线程、进程间通信)的更多相关文章
- 学习《Unix/Linux编程实践教程》(1):Unix 系统编程概述
0.目录 1.概念 2.系统资源 3.学习方法 4.从用户的角度来理解 Unix 4.1 登录--运行程序--注销 4.2 目录操作 4.3 文件操作 5.从系统的角度来理解 Unix 5.1 网络桥 ...
- Unix/Linux编程实践教程(0:文件、终端、信号)
本来只打算读这本书socket等相关内容,但书写得实在好,还是决定把其余的内容都读一下. 阅读联机帮助的一个示例: open系统调用: read系统调用: Unix的time: 上面的printf可以 ...
- Unix/Linux编程实践教程(一:进程、管道)
execvp在程序中启动新程序: 用fork创建新进程: forkdemo2代码: 测试fork的时候参考<Linux权威指南>阅读笔记(3) 使用了patch: [root@local ...
- Unix/Linux编程实践教程(三:代码、测试)
测试logfilec.c的时候,有个sendto(sock,msg,strlen(msg),0,&addr,addrlen),编译时提示: logfilec.c:30: warning: pa ...
- 学习《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 ...
- C#编程总结(二)多线程基础
C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...
- 【Linux/unix网络编程】之使用socket进行TCP编程
实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...
- Unix Linux 编程书籍
UNIX环境高级编程(第3版) Advanced Programming in the UNIX Environment Linux/UNIX系统编程手册 Linux/UNIX系统编程手册 (豆瓣) ...
- 项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】
在第一篇文章 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]发布后,根据大家的回复,我需要向大家说明几个问题: 1.为什么要用VisualSVN Server,而不用Subver ...
随机推荐
- iOS网络开发之AFNetworking
概述 AFNetworking是一个非常受欢迎的轻量级的iOS.Mac OS X网络通信类库.它建立在NSURLConnection.NSOperation以及其技术的基础上,有着精心设计的模块结构和 ...
- static单利模式
// // main.m // 01-文件管理器 // // Created by apple on 14-3-21. // Copyright (c) 2014年 apple. All ri ...
- itunes connect
https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/iTunesConnec ...
- fail2ban使用
转子: http://www.2cto.com/Article/201406/310910.html 1.fail2ban简介: fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹 ...
- Python xml
第一部分:读 ######## ## # -*- coding:utf-8 -*- """ * User: not me * Date: 11-11-9 * Time: ...
- PostgreSQL与RPM
如何查看使用PostgreSQL的RPM包安装后的文件目录及相关路径(PostgreSQLRPM的spec文件已经帮我们创建好了postgres用户及postgres组). 查看RPM文档信息:/us ...
- for 穷举、迭代 while循环
1.穷举: 把所有可能的情况都走一遍,使用if条件筛选出来满足条件的情况. 2.百鸡百钱:公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只,总共只有100文钱,如何在凑够100只鸡的情况下刚好花完100 ...
- Java基础(56):Java---Assertion的试用(华为OJ里的Java题目的用例检测就是用的断言)
一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,它是该版本在Java语言方面最大的革新. 从理论上来说,通过 assertion方式可以证明程 ...
- C++之路进阶——bzoj3172(单词)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...
- JS_01_入门学习
01:编写js文件:JavaScript_01.js // JavaScript Document //1.利用JavaScript来输出文字 <script type="text/j ...