1.聚优致成-----https://blog.youkuaiyun.com/qq_29350001/article/details/72832155
UNIX再学习–进程间通信之管道
IPC之前进程间交换信息的方法只能是由fork或exec传送文件
进程间通信方式有:
1)管道
2)消息队列
3)信号量
4)共享存储
5)套接字
其中消息队列,信号量,共享存储统称为XSI IPC通信方式
管道局限性:半双工,管道只能在具有公共祖先的两个进程之间使用,通常一个管道由一个进程创建
无名管道:是一个与文件系统无关的内核对象,主要用于父子进程之间的通信,需要用专门的系统调用函数创建
当管道的一端被关闭后,
1)当读(read)一个写端已经被关闭的管道时,在所有数据都被读取后,read返回0,标识文件结束
2)如果写(write)一个读端已经被关闭的管道,则产生信号SIGPIPE,。在写管道时,常量PIPE_BUF规定了内核中管道缓冲区的大小,如果对管道调用write,而且要求写的字节数小于等于PIPE_BUF,则操作不会与其它进程对同一管道的write操作交叉进行。用pathconf或fpathconf函数可以确定PIPE_BUF的值。
5)函数popen和pclose
#include<stdio.h>
FIFE popen(const char cmdstring,const char *type);//若成功则返回文件指针,出错返回NULL
int pclose(FIFE *fp);//返回cmdstring的终止状态,若出错则返回-1
1)函数解析:常见的操作是创建一个连接到另一个进程的管道,然后读其输出或向其输入端发送数据
函数popen先执行fork,然后调用exec执行cmdstring,并且返回一个标准I/O文件指针。如果type是r,则文件指针连接到cmdstring标注输出
pclose函数关闭标准I/O流,等待命令终止,然后返回shell的终止状态。
==有名管道亦称FIFO,它的路径名存在于文件系统中。通过mkfifo命令可以创建管道文件
===看到一个更加不错的大神博客(吴秦(Tyler)-----https://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html#4330332
Linux Socket编程
本地间通信(IPC)有很多方式,
消息传递(管道,FIFO,消息队列)
同步(互坼量,条件变量,读写锁)
共享 内存
远程过程调用
问题1:如何标识一个唯一进程
TCP/IP协议簇,网络层的ip地址可以唯一标识网络中的主机,而传输层的协议+端口可以唯一标识主机中的应用程序(进程)。利用三元组(ip地址,协议,端口)就可以标识网络的进程
socket起源与unix,unix一切皆文件,socket是一种特俗的文件
Int socket(int domain,int type,int protocol)
socket函数对应于管理文件的打开操作。普通文件的打开操作返回一个文件描述符,socket函数用于创建一个socket描述符
参数:domain:协议域,aF_INET,AF_INET6,协议簇决定了socket的地址类型,在通信1中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位)于端口的组合。
type:指定socket类型
protocol就是指定协议
当我们调用socket创建一个socket时返回的socket描述字它存在于协议簇(address family,AF_XXX)空间中,但是没有一个具体的地址,要调用bind()函数
int bind(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
函数的三个参数分别位:
sockfd:即socket描述字,唯一标识一个socket
addr:一个const struct sockaddr*指针,指向要绑定给sockfd的协议地址。这个地址结构更具地址创建socket时的地址协议簇的不同而不同
addrlen:对应的是地址的长度
=======C++静态库与动态库--------
–转载连接:https://www.cnblogs.com/skynet/p/3372855.html
Linux静态库命名规则
lib[静态库名].a(.a是扩展名)
1)首先将代码文件编译成目标文件.o
g++ -c StaticMath.cpp
注意带参数-c,否则直接编译为可执行文件
2)然后通过ar工具将目标文件打包成.a静态库文件
ar -crv libstaticmath.a StaticMath.o
生成静态库libstaticmath.a
大一点的项目会编写makefile文件(CMake等等工程管理工具)来生成静态库,输入多个命令太麻烦
使用静态库文件
只需要在编译的时候,指定静态库的收索路径(-L选项),指定静态库名
#g++ TestStaticLibrary.cpp
-L…/StaticLibrary -lstaticmath
在Windows系统下执行文件格式是PE格式,动态库需要一个DLLMain函数作为初始化入口,通常在导出函数声明时需要_declspec(dllexport)关键字
2)Linxu下gcc编译的执行文件默认是ELF格式
更加详细连接:https://blog.youkuaiyun.com/q_l_s/article/details/51313842
=linux下C/C++编译时系统搜索include和链接库文件路径的指定
https://blog.youkuaiyun.com/alllenlinrui/article/details/21483617
[]include头文件的路径
除了默认的/use/include,/usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径:
export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
以上修改可以命令行输入,可以/etc/profile中完成(所有用户),用户home命令下的bashrc或.bash_profile添加
c++中vecto的用法详解=
转载https://blog.youkuaiyun.com/hancunai0017/article/details/7032383
vector
是c++中的一种数据结构,一个类,动态数组
对于其源码进行剖析https://blog.youkuaiyun.com/u012658346/article/details/50725933
vector的定义
template<class _Ty,class _Ax>
class vector
:public _Vector_val<_Ty,_Ax>
{
public:
protected:
pointer _Myfirst;
}
size大小表示vector中已有的元素的个数,容量capacity表示vector最多可存储的元素的个数