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 ...
随机推荐
- (转)JAVA的整型与字符串相互转换
JAVA的整型与字符串相互转换1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 ...
- JavaScript 闭包总结 (深入理解)
什么是闭包 简单的说闭包就是函数里面的函数,<JavaScript高级程序设计>里是这样定义的 闭包是指有权访问另一个函数作用域中的变量的函数. 先看一道面试时经常被考的题目 代码1: & ...
- 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换
最近因为项目需要在做两个项目间数据同步的需求,具体是项目1的数据通过消息队列同步到项目2中,因为这个更新操作还涉及到更新多个库的数据,所以就需要多数据源切换的操作.下面就讲讲在Spring中如何进行数 ...
- 【异构计算】在Windows下使用OpenCL配置
前言 目前,NVIDIA 和 AMD 的 Windows driver 均有支持OpenCL(NVIDIA 的正式版 driver 是从自195.62 版开始,而 AMD则是从9.11 版开始).NV ...
- JAVA三大特性之一——封装
自学java已经有一段时间了,但是感觉对于很多知识点还是有必要总结和整理一下,下面我就来说一下我对JAVA三大特性之一——封装特性的认识和理解. 封装,从字面意思可以看出来,就是包装,也就是把我们写好 ...
- 前端学PHP之日期与时间
前面的话 在Web程序开发时,时间发挥着重要的作用,不仅在数据存储和显示时需要日期和时间的参与,好多功能模块的开发,时间通常都是至关重要的.网页静态化需要判断缓存时间.页面访问消耗的时间需要计算.根据 ...
- 每天一个Linux命令(09)--touch命令
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]··· 文件··· 2.命令参数: -a 或 ...
- 代写编程的作业、笔试题、课程设计,包括但不限于C/C++/Python
代写编程作业/笔试题/课程设计,包括但不限于C/C++/Python 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一! (截止2016-11-22已接12单,顺利完成!后文有成功交付的聊天 ...
- Servlet的监听
Servlet监听 在<Servlet和Jsp>中我们使用了ServletConfig获取Servlet的初始配置,用ServletContext来获取整个Web应用的初始配置,但如果需要 ...
- IP头、TCP头、UDP头详解以及定义
一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/typedef struct _MAC_FRAME_HEADER{ char m_cDstMacAddress[6]; //目的m ...