Linux 和 Windows 下实现多进程的方式以及管道操作
1.windows 多进程
使用 #include<windows.h> 下面的
BOOL CreateProcess(
LPCWSTR pszImageName, LPCWSTR pszCmdLine,
LPSECURITY_ATTRIBUTES psaProcess,
LPSECURITY_ATTRIBUTES psaThread,
BOOL fInheritHandles, DWORD fdwCreate,
LPVOID pvEnvironment, LPWSTR pszCurDir,
LPSTARTUPINFOW psiStartInfo,
LPPROCESS_INFORMATION pProcInfo
);
其中几个关键的形参为:
STARTUPINFO sui;
PROCESS_INFORMATION pi;
ZeroMemory(&sui,sizeof(STARTUPINFO));
sui.cb = sizeof(STARTUPINFO);
sui.dwFlags = STARTF_USESTDHANDLES;
sui.hStdInput = hRead;
sui.hStdOutput = hWrite;
sui.hStdError = GetStdHandle(STD_ERROR_HANDLE);
CreateProcess("../.../run/Chilid.exe",NULL,NULL,NULL,TRUE,,NULL,NULL,&sui,&pi);
参数pszCmdLine //用来指定传递给新进程的命令行字符串
TCHAR szApp[MAX_PATH] = TEXT("netstat -s");
CreateProcess(NULL,szApp,NULL,NULL,TRUE,,NULL,NULL,&sui,&pi);
typedef struct _STARTUPINFOA {
DWORD cb;
LPSTR lpReserved;
LPSTR lpDesktop;
LPSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
对于 dwFlags 参数来说,如果其设置为 STARTF_USESTDHANDLES ,则将会使用该 STARTUPINFO 结构体中的 hStdInput , hStdOutput , hStdError 成员,来设置新创 建的进程的标准输入,标准输出,标准错误句柄。
参数 pProcInfo //为一个输出参数,指向一个 PROCESS_INFORMATION 结构体的指针,用来接收关于新进程的标识信息。
其中 hProcess 和 hThread 分别用来标识新创建的进程句柄和新创建的进程的主线程句柄。
dwProcessId 和 dwThreadId 分别是全局进程标识符和全局线程标识符。前者可以用来标识一个进程,后者用来标识一个线程
typedef struct _PROCESS_INFORMATION
{ HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
}PROCESS_INFORMATION;
【注】CreateProcess()和CreateThread()的区别,是前者创建的是进程,而后者创建的是线程。
<unistd.h> ---- exec系列;
<stdlib.h> ---- sysytem();
e.g
system("cd /home/root/");
【注】linux下创建线程的方式
<pthread.h> ---- pthread_create
e.g:
int * thread(void *arg){}
pthread_t id; //记录创建线程的id
pthread_create(&id,NULL,(void*) thread,NULL);
二、管道
1、windows 下的管道
a. 匿名管道 -- 进程和其子进程之间通信
#include<iostream>
#include <windows.h>
#define MAX_PATH 1024
using namespace std;
int main(){
TCHAR szApp[MAX_PATH] = TEXT("netstat -s");
char ReadBuf[];
DWORD ReadNum;
HANDLE hRead = NULL; // 管道读句柄
HANDLE hWrite = NULL; // 管道写句柄
SECURITY_ATTRIBUTES sa = {};
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
bool bRet = CreatePipe(&hRead, &hWrite, &sa, );
if (bRet)
{
cout<<"创建管道成功"<<endl;
}
else{
cout<<"创建管道失败"<<endl;
}
STARTUPINFO si = {sizeof(si)};
PROCESS_INFORMATION pi = {};
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.hStdOutput = hWrite;
si.hStdError = hWrite;
si.wShowWindow = SW_HIDE;
HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);
GetStartupInfo(&si);
bRet = CreateProcess(NULL,szApp,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi); //创建一个执行命令行的进程
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hWrite);
int i = ;
while(ReadFile(hRead,ReadBuf,,&ReadNum,NULL)){ //对管道进行读操作
ReadBuf[ReadNum] = '\0';
cout<<"panfei"<<endl;
cout<<i++<<endl;
//cout<<ReadBuf<<endl;
}
if(GetLastError() == ERROR_BROKEN_PIPE)
cout<<"管道被子进程关闭"<<endl;
ExitProcess();
return ;
}
b. 命名管道 -- 可以实现两个无任何亲缘关系的进程之间的数据传递
server端:
#include <iostream>
#inserclude <Windows.h>
HANDLE hpipe = INVALID_HANDLE_VALUE;
LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe"); //★管道的名称必须这样命名,托付给系统管理
int main(){
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
hpipe = CreateNamedPipe( //创建命名pipe
lpszPipename, // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZ, // output buffer size
BUFSIZ, // input buffer size
, // client time-out
NULL); // default security attribute
if (hpipe == INVALID_HANDLE_VALUE)
{
cout<<"CreateNamedPipe failed, GLE=%d.\n"<<endl;;
return -;
}
BOOL fConnected = ConnectNamedPipe(hpipe, NULL) ? TRUE : (GetLastError() == ERROR_PIPE_CONNECTED); //等待有其他进程连接该pipe ,一旦有进程连接该pipe,下面的代码才会执行
char buf[] = {'a','b','a','\0'};
WriteFile(hpipe,buf,,NULL,NULL);
return ;
}
client端:
int main(){
hPipe = CreateFile( //连接server创建的pipe
lpszPipename, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
, // default attributes
NULL); // no template file
DWORD dwMode = PIPE_READMODE_MESSAGE;
BOOL fSuccess = SetNamedPipeHandleState( //设置管道的状态,设置到读取状态
hPipe, // pipe handle
&dwMode, // new pipe mode
NULL, // don't set maximum bytes
NULL); // don't set maximum time
DWORD cbRead;
fSuccess = ReadFile( //读取管道中的数据
hPipe, // pipe handle
readBuf, // buffer to receive reply
BUFSIZ*sizeof(TCHAR), // size of buffer
&cbRead, // number of bytes read
NULL); // not overlapped
cout<<readBuf<<endl;
}
2. Linux 下的管道
a. 匿名管道
e.g
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main(){
int pfd[]; //用于保存打开管道后的两个文件描述符号
pid_t cpid; //进程id
char buf;
if(pipe(pfd) == -){
fprintf("Pipe created fail!");
}
cpid = fork();
if(cpid == ){
close(pfd[]); //读管道前关闭管道写端
while(read(pfd[],&buf,){ //读取管道
printf("%s\n",buf);
}
exit() //退出子进程
}
else{
char writeBuf[] = {'a','b','c'};
close(pfd[]);
wirte(pfd[],writeBuf,sizeof(writeBuf)); //向管道中写入数据
exit();
}
}
b. 命名管道
参考:http://www.cppblog.com/wanghaiguang/archive/2012/11/20/195412.html
Linux 和 Windows 下实现多进程的方式以及管道操作的更多相关文章
- [笔记]linux下和windows下的 创建线程函数
linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...
- tar.xz如何解压:linux和windows下tar.xz解压命令介绍
在linux下怎么解压和压缩tar.xz文件? (本文由www.169it.com搜集整理) 在linux下解压tar.xz文件步骤 1 2 # xz -d ***.tar.xz //先解压xz # ...
- 从Docker在Linux和Windows下的区别简单理解Docker的层次结构
上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的W ...
- 【转】linux和windows下安装python集成开发环境及其python包
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- protobuff 配合 libevent 在Linux 和windows 下的使用
protobuff 配合 libevent 在Linux 和windows 下的使用待补全. libprotobuf.lib libproto-lite.lib libprotoc.lib
- Linux/centos/redhat下各种压缩解压缩方式详解
1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...
- Linux和Windows下查看环境变量方法对比
摘自:Linux和Windows下查看环境变量方法对比 一.查看所有环境变量的名称和值 Linux下:export Windows下:set 二.根据名称查该环境变量的值 Linux下:echo $环 ...
- Golang 在 Mac、Linux、Windows 下如何交叉编译(转)
原文地址:Golang 在 Mac.Linux.Windows 下如何交叉编译 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下 ...
- linux和windows下TIME_WAIT过多的解决办法
http://www.51testing.com/html/48/202848-249774.html linux和windows下TIME_WAIT过多的解决办法 http://m.sohu.com ...
随机推荐
- A manager is becoming more and more popular in China
A manager is becoming more and more popular in China; many people want to possess a position like th ...
- Myeclipse 搭建Java Web 项目:Servlet 《二》
上一节,我们使用myeclipse部署了web项目,但那部署的为静态的web项目,下面我们来学习编写动态的web项目,编写动态项目必须要用到的为:servlet. Servlet是由sun公司命名的, ...
- BZOJ 4085:[Sdoi2015]bigyration(SDOI 2015 round 2 Day 1)
别人家的神选系列.Day2根本不能做QAQ 题目描述:给定两个字符串集合,一个长度为n,另一个为m,求有多少个数字对i,j,满足xi+yj能由一个(n+m)/2的字符串旋转拼接而成 我们枚举长度较长的 ...
- Web Service ,WCF以及Web API的对比
Web Service 1.基于SOAP和XML形式的返回数据. 2.只支出HTTP协议. 3.只能运行在IIS环境下. 4.不是开源的,但可以由任何支持xml的客户端下使用. WCF 1.基于SOA ...
- p1221网络布线(最小生成树 Prim(普里母)算法) p1222 Watering Hole
描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助.约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路 ...
- 浅解.Net分布式锁的实现
序言 我晚上有在公司多呆会儿的习惯,所以很多晚上我都是最后一个离开公司的.当然也有一些同事,跟我一样喜欢在公司多搞会儿.这篇文章就要从,去年年末一个多搞会的晚上说起,那是一个夜黑风高的晚上,公司应该没 ...
- PCB行业版特色功能展示
普实PCB行业版,专为PCB行业需求而定制.秉承一体化.集团化.移动化为设计理念,采用互联网技术.云计算技术.移动应用技术开发的新一代系统帮助PCB企业创新管理模式.引领商业变革!系统从接到订单开始, ...
- 10条建议让你创建更好的jQuery插件
在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了.使 ...
- 自己动手编写Maven的插件
Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要.本文参考官方文档后使用archetype创建,手动创建太麻烦. 创建创建项目 选择maven-archetype-moj ...
- 1202: [HNOI2005]狡猾的商人
1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1554 Solved: 745[Submit][Stat ...