CE-RTI开源软件代码学习笔记(二)

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都使用:

  1. wchar_t wszCmd[] = L" Hello I am 小明";  
  2. CreateProcess(L"C:\\Program Files\\WinRAR\\WinRAR.exe", wszCmd, ...);  

注意,wszCmd[],也就是lpCommandLine的内容中开头需要一个空格,不然就和lpApplicationName连在一起去了,成了“C:\\Program Files\\WinRAR\\WinRAR.exeHello I am 小明”。

第二种方式:

只使用lpCommandLine:

  1. wchar_t wszPath[] = L"\"C:\\Program Files\\WinRAR\\WinRAR.exe\" Hello I am 小明";  
  2. CreateProcess(NULL, wszPath, ...);  
为什么字符串中的C:\\Program Files\\WinRAR\\WinRAR.exe还要加上双引号?为了避免路径中的空格带来歧义,比如C:\Program Files\WinRAR\WinRAR.exe可以解释为C:\Program是可执行文件Files\WinRAR\WinRAR.exe是命令行参数,如果路径中不存在空格则不需要加双引号,为了规范而不易出错,最好保持每次都加上双引号的习惯。

使用方法如下:
         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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值