1、CreateProcess
CreateProcess函数用来创建一个新的线程,新进程运行制定的可执行文件。
函数原型:
BOOL CreateProcess(
LPCTSTR lpApplicationName, //执行程序名
LPTSTR lpCommandLine, // 参数行
//下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
LPSECURITY_ATTRIBUTES lpProcessAttributes, //process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // 继承标志
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // 环境变量
LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录
LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性
LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
);
其第一个参数为lpApplicationName,从字面意思上看应该是一个可执行文件的名字,第二个参数为lpCommandLine,从字面意思上看应该是一个启动进程时传给程序的命令行。实际上并没有想象中的那么简单,
第一种方式:
lpApplicationName和lpCommandLine都使用:
- wchar_t wszCmd[] = L" Hello I am 小明";
- CreateProcess(L"C:\\Program Files\\WinRAR\\WinRAR.exe", wszCmd, ...);
注意,wszCmd[],也就是lpCommandLine的内容中开头需要一个空格,不然就和lpApplicationName连在一起去了,成了“C:\\Program Files\\WinRAR\\WinRAR.exeHello I am 小明”。
只使用lpCommandLine:
- wchar_t wszPath[] = L"\"C:\\Program Files\\WinRAR\\WinRAR.exe\" Hello I am 小明";
- CreateProcess(NULL, wszPath, ...);
使用方法如下:
PROCESS_INFORMATION pi; //启动窗口的信息
STARTUPINFO si; //进程的信息
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
bool fRet=CreateProcess("D:\\putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);
参考资料:
http://blog.csdn.net/archielau/article/details/7879718
http://www.cnblogs.com/Gotogoo/p/5262536.html
http://blog.csdn.net/charlessimonyi/article/details/43957429
2、socketpair、DuplicateHandle
socketpair:Linux实现了一个源自BSD的socketpair调用,可以实现上述在同一个文件描述符中进行读写的功能。该系统调用能创建一对已连接的UNIX族socket。在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写,函数原型如下:
int socketpair(int d, int type, int protocol, int sv[2]);
参数介绍:
socketpair()函数建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。
第1个参数d,表示协议族,只能为AF_LOCAL或者AF_UNIX;
第2个参数type,表示类型,只能为0。
第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数sv,用于保存建立的套接字对。
参考文献:http://blog.csdn.net/kobejayandy/article/details/18850115
DuplicateHandle:我的理解是用于在进程间复制句柄。
功能:将一个进程内的伪句柄,转化为可以用来进程间通信的实句柄
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions
);
第一个参数是当前的源进程句柄,
第二参数是当前的资源句柄,
第三个是目标进程的句柄,
第四个是你要得到的目的句柄,这里应该是一个变量,使用指针,DuplicateHandle函数会将得到的句柄设置到这个参数上,
第五个是访问的方式,
第六个参数是得到的句柄能不能被得到的其的进程的子进程继承。
如果第七个参数是DUPLICATE_SAME_ACCESS flag标志,那么这个参数将被忽略,
该函数由此把hSourceHandle的资源伪句柄转化为实句柄,并且复制给lpTargetHandle,通信时用lpTargetHandle指向的句柄通信。
其中,第一个很第三个参数可以相同也可以不同。既把某个进程的内核资源句柄复制给另一个进程对象,若这两个参数都为GetCurrentProcess(),则表示将该资源对象句柄(也就是第二个参数句柄)转化为实句柄,因为第一个和第三个参数相同,所以此函数只是把伪句柄转化为了实句柄。若想让两个进程通信,还需要将此转化后的实句柄传递给其他进程。若第三个参数句柄不是GetCurrentProcess(),而是某个进程的实句柄,则此函数不仅把伪句柄转化成了实句柄,同时,将转化后的实句柄传递给了另一个进程
参考文献:http://blog.csdn.net/zhangjie121/article/details/11525063
http://www.cnblogs.com/staring-hxs/p/3576927.html