一、多进程

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
);

其中几个关键的形参为:

    参数pszImageName   //指向一个NULL终止的字符串,用来指定可执行程序的名字。
    e.g:
 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    //用来指定传递给新进程的命令行字符串

    e.g:
  TCHAR szApp[MAX_PATH] = TEXT("netstat -s");
CreateProcess(NULL,szApp,NULL,NULL,TRUE,,NULL,NULL,&sui,&pi);
     参数psiStartInfo   //指向一个 StartUpInfo 的结构体的指针,用来指定新进程的主窗口如何显示
 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()的区别,是前者创建的是进程,而后者创建的是线程。

2. Linux下多进程
    Linux创建线程的主要方式有:
    <unistd.h> ---- fork();

<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 下实现多进程的方式以及管道操作的更多相关文章

  1. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

  2. tar.xz如何解压:linux和windows下tar.xz解压命令介绍

    在linux下怎么解压和压缩tar.xz文件? (本文由www.169it.com搜集整理) 在linux下解压tar.xz文件步骤 1 2 # xz -d ***.tar.xz  //先解压xz # ...

  3. 从Docker在Linux和Windows下的区别简单理解Docker的层次结构

    上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的W ...

  4. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  5. protobuff 配合 libevent 在Linux 和windows 下的使用

    protobuff 配合 libevent 在Linux 和windows 下的使用待补全. libprotobuf.lib libproto-lite.lib libprotoc.lib

  6. Linux/centos/redhat下各种压缩解压缩方式详解

    1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...

  7. Linux和Windows下查看环境变量方法对比

    摘自:Linux和Windows下查看环境变量方法对比 一.查看所有环境变量的名称和值 Linux下:export Windows下:set 二.根据名称查该环境变量的值 Linux下:echo $环 ...

  8. Golang 在 Mac、Linux、Windows 下如何交叉编译(转)

    原文地址:Golang 在 Mac.Linux.Windows 下如何交叉编译 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序,最近使用了一下,非常好用,这里备忘一下. Mac 下 ...

  9. linux和windows下TIME_WAIT过多的解决办法

    http://www.51testing.com/html/48/202848-249774.html linux和windows下TIME_WAIT过多的解决办法 http://m.sohu.com ...

随机推荐

  1. 动态样式语言—LESS

    博客原文地址:Claiyre的个人博客 https://claiyre.github.io/ 博客园地址:http://www.cnblogs.com/nuannuan7362/ 如需转载,请在文章开 ...

  2. JVM垃圾收集(GC)算法

    判断对象是否已死 1. 引用计数算法 给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1:当引用失败时,计数器值就减1:任何时刻计数器为0的对象就是不能再被使用的. 主流的Java虚拟机 ...

  3. c#访问数据库的两种方法以及事务的两种方法

    //2015/07/03 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  4. Android Asynctask的优缺点

    导语:之前做习惯了Framework层的开发,今天在武汉斗鱼公司面试APP客户端的开发,其中一道题是讲述Asynctask的优缺点,我靠,我只是知道有这么一个东西,会用而已,看来之前的生活太过于安逸, ...

  5. Asp.net mvc 知多少(八)

    本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问[http: ...

  6. tornado学习 - TCPServer 实现聊天功能

    最近学习tornado框架,其中有很多值得学习的模块,鉴于某位学长的建议,也决定好好看看tornado.tcpserver. 关于TCP协议详细介绍可查阅wiki. 对于TCP服务器,基本的操作tor ...

  7. C语言程序的三种基本结构

    1.程序结构:在C语言程序中,一共有三种程序结构:顺序结构.选择结构(分支结构).循环结构: 顺序结构:从头到尾一句接着一句的执行下来,直到执行完最后一句: 选择结构:到某个节点后,会根据一次判断的结 ...

  8. lamp论坛搭建

    1.配置本地yum源   mount 2.安装软件 yum install httpd mariadb mariadb-server   php php-mysql php-gd libjpeg*   ...

  9. 用JS获取地址栏中的参数的简易方法

    这个方法用起来超级简单,传入参数即可直接获取地址栏中的参数 代码如下 function GetQueryString(name) { var reg = new RegExp("(^|&am ...

  10. php+redis 简易的实现文章发布系统(用户投票系统)

    /** * @data 文章发布 * 文章详情散列表中递增ID,讲文章发布者ID写入投票用户集合中,设置投票时间为一周 * 讲文章内容写入文章散列中,讲文章写入文章评分有序集合和文章发布有序集合中 * ...