专业pc网站建设,汽车网站策划书,网站如何能吸引用户,下载百度搜索文章目录 创建进程的方法Linuxforkexecsystem Windowscreateprocessshellexecutesystem 进程间通信方法管道#xff08;Pipe#xff09;管道的种类特点 通过文件通信内存映射#xff08;文件映射#xff09;匿名映射 共享内存 信号量(或者锁)消息队列Windows消息队列Linux… 文章目录 创建进程的方法Linuxforkexecsystem Windowscreateprocessshellexecutesystem 进程间通信方法管道Pipe管道的种类特点 通过文件通信内存映射文件映射匿名映射 共享内存 信号量(或者锁)消息队列Windows消息队列Linux消息队列 信号Socket 创建进程的方法
Linux
fork
使用fork()函数可以创建子进程子进程复制父进程的虚拟内存。和父进程共享代码。 fork()在父进程中返回子进程ID在子进程中返回0执行错误返回-1。 Linux c/c之进程的创建
exec
exec函数簇在子进程占用调用相关函数可以进行进程替换。 即从调用exec开始子进程就替换成exec调用的进程而原本的子进程代码将不再执行。
system
system系统调用可以启动一个新的进程但是父进程会挂起等待新的进程结束。
Windows
createprocess
windows中没有fork()。 windows中一般通过CreateProcess()函数调用一个执行的可执行程序来启动一个新的进程父进程不需要等待子进程结束。 看到网上有在windows中模拟fork()的方法还没看过。 windows下创建进程CreateProcess()详解及用法
shellexecute
shellexecute 可以启动一个新的进程父进程不需要等待子进程结束。它支持文件关联即不指定notepad 直接让他打开一个txt文件它也会用notepad或者其他关联的程序打开。 例如
ShellExecuteA(NULL, open, D:\\text.txt, NULL, NULL, SW_SHOWNORMAL);ShellExecute详细用法
system
system系统调用可以启动一个新的进程但是父进程会挂起等待新的进程结束。
进程间通信方法
管道Pipe
管道的种类
无名管道通常就叫管道 Pipe命名管道 FIFO-Pipe
特点
windows和linux都支持管道。无名管道用于父子进程之间。命名管道可以用于不相关的进程间的通信。管道是半双工的管道的可以设置阻塞和非阻塞
阻塞 一个为只读而打开一个管道的进程会阻塞直到另一个进程为只写打开管道 一个为只写而打开一个管道的进程会阻塞直到另一个进程为只读打开管道 read()/write()也是阻塞的
非阻塞 以只读方式打开FIFO如果没有进程为写而打开FIFO 只读open成功并且open不阻塞 以只写方式打开FIFO, 如果没有进程为读而打开FIFO只写open将出错返回-1 ENXIO: No Such device or address) read()/write()也是阻塞的
无论是否阻塞像一个读端关闭的管道写入数据会产生SIGPIPE错误
参考 C项目实战-多进程(一篇文章) 命名管道的阻塞和非阻塞模式的初步探讨
通过文件通信
可以通过新建一个文件然后一个进程向里面写一个进程从里面读。 其实这和管道思想类似。 参考C项目实战-多进程(一篇文章)
内存映射文件映射
内存映射就是通过内核把一个磁盘文件映射到进程的虚拟内存中。进程可以通过指针来访问映射的文件内存对文件进行修改内核会负责把修改同步回磁盘文件。
Windows和Linux都支持文件映射文件映射可以用于父子进程之间也可以用于不相关进程用于父子进程之间只需要在fork()之前映射一次就行因为子进程会拷贝父进程的虚拟内存用于不相关进程之间需要两个进程都进行映射。进行文件映射时需要先打开文件获取文件描述符文件映射开始后文件描述符随时可以close。如果用于进程间通信必须设置文件映射为共享的Linux选项是MAP_SHARED使用文件映射也存在谁读谁写的问题它也不是全双工的
匿名映射
就是不指定文件描述符的映射类似于管道和命名管道的区别匿名映射只能用于父子进程之间。
参考 C项目实战-多进程(一篇文章) [内存] windows 实现内存映射
共享内存 信号量(或者锁) 共享内存是一种进程间的通信机制并且也是最底层的一种机制其他的通信机制还有管道消息队列等。 进程之间通过访问一块共享的空间来进行数据的通信交换。具体来讲就是将一份物理内存映射到不同进程各自的虚拟地址空间这样每个进程都可以读写这片相同的物理内存。 共享内存是速度最快的一种进程间通信IPC方式它直接对内存进行存取比操作系统提供的读写系统服务更快。 由上面的描述我们发现当多个进程对同一片空间进行读写时必然会出现同步的问题所以一般共享内存会和信号量或者锁机制一同使用保证数据的一致性。 Windows和Linux都支持Windows中共享内存和内存映射的调用API基本一样都有CreateFileMapping()和MapViewOfFile()根据下面参考文章可以看出原理是差不多的内存映射多了磁盘映射到物理内存这一步。参照内存映射共享内存也可以用于父子进程或者非父子进程。共享内存是高效的进程间通信方法。
参考 【学习笔记】windows 下的 shared memory共享内存原理与实践 C项目实战-多进程(一篇文章)
消息队列
Windows消息队列
Windows中如果是窗口线程是可以通过线程的消息队列进行IPC的但是如果没有窗口线程就没法用这个方法了因为PostMessage函数需要窗口句柄。Windows消息传递的参数是有限制的。WParam和LParam都是32位整数我感觉IPC中Windows的消息只能传递消息本身让接收端对不同消息产生不同处理。
进程间通信IPC-Windows消息
Linux消息队列 消息队列是由消息的链表存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 来源https://segmentfault.com/a/1190000010739303 Linux中提供了不同进程中发送数据块的方法就是消息队列。 消息队列的好处是消息队列由系统运行发送端和接收端不需要考虑消息的同步问题只需要接收和发送就好了。
消息队列是异步的。发送者和接收者不需要同时在线它们可以独立地工作。这种方式提供了一种高效的通讯方式特别是在高并发的环境中。当队列满时发送者进程可能会被阻塞直到队列中有足够的空间为止。消息队列的大小、每个消息的大小和消息队列的总大小都是由限制的。
参考 Linux进程间通讯方式的深入对比与分析和权衡 - 泡沫o0的文章 - 知乎 【Linux】进程间通信IPC之消息队列详解及测试用例
信号
信号比较麻烦我也没用过直接参考以下文章
参考 C项目实战-信号 信号集未决信号集阻塞信号集
Socket
通过本地Socket来进行IPC本地Sockset和通常的网络Socket设置有点不同参考以下文章。 参考 Linux进程间通信方式–本地socket