首先先对进程有一个总结:
进程是一个程序的一次执行,这里的进程一般是指运行在用户态的进程,而处于用户态的不同进程之间是彼此隔离的。
Linux中使用较多的进程间通信
1.管道(Pipe)及 有名管道:管道可用于具有亲缘关系进程间的通信,对于有名管道,还具有无亲缘关系进程间的通信。
管道是基于文件描述符的通信方式
注意:当一个管道共享多对文件描述符时,若将其中的一对读写文件描述符都删除,则该管道则失效
无名管道:
1.只能在具有亲缘关系的进程之间的通信(父子进程与兄弟进程之间)
2.它是一个半双工的通信模式,具有固定的读端和写端
3.管道也可以看成一种特殊的文件,对于读写也可以使用普通的read(),write();但是它不是普通的文件,并不属于其他任何文件系统,并且只存在内核的内存空间中。
标准流管道:
这种基于文件流的管道主要是用来创建连接到另外一个进程的管道(和基于文件流的标准I/o操作一样),而且必须使用标准i/o函数进行操作,不能使用前面的read(),write()一类不带缓冲的i/o函数
有名管道:
不限于亲缘关系进程间的通信
该管道可以通过路径名来指出,并且在文件系统中是可见的,在建立之后,两个进程可以把它当做普通文件一样进行读写操作。
2.信号
信号是在软件层次上对中断机制的一种模拟,用于通知进程有某事件发生是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互。内核进程也可以用它通知用户空间发生了什么系统事件。
一个完整的信号生命周期可以分为3个重要阶段,这3个阶段由4个重要事件来刻画的:信号产生,信号在进程中注册,信号在进程中注销,执行信号处理函数。
3信号量
主要作为进程之间以及同一进程的不同的不同线程之间的同步和互斥手段。
信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作。信号量的值指的是当前可用的该资源的数量。
两个原子p和v的操作:
这篇博客讲得不错:https://blog.csdn.net/cs_hnu_scw/article/details/80204038
4共享内存
它使得多个进程可以访问同一块内存空间,不同进程可以及时看见对方进程中对共享内存中数据的更新。这种通信方式需要依靠某种同步机制,如互斥锁和信号量。共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据的复制。访问的进程将其映射到自己的私有地址空间。一般过程就是1开辟内存 2映射内存 3 撤销内存。
5消息队列
消息队列就是一些消息的队列,用户可以从消息队列中添加消息和读取消息。消息队列的实现包括创建或打开消息队列,添加消息,读取消息和控制消息队列。
int strncmp ( const char * str1, const char * str2, size_t n );
【参数】str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。
【返回值】若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
char *strncpy(char *dest, const char *src, int n),把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest
char * strncat(char *dest, const char *src, size_t n);
【参数说明】:dest指向目标字符串,src为指向源字符串。
把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接。