创建子进程句柄继承问题

问题描述

创建子进程句柄继承问题
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead, hWrite;
    std::string result;
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = FALSE;//TRUE;

    if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
        cout << "创建管道失败!" << endl;
        return FALSE;
    }

    STARTUPINFO si = {0};
    si.cb = sizeof(si);
    si.dwFlags |= STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; // 使用默认的IO句柄

    si.hStdOutput = hWrite;
    si.hStdError = hWrite;

    si.wShowWindow = SW_SHOWNORMAL; //  隐藏控制台窗口
    PROCESS_INFORMATION pi = {0};  

    TCHAR para[100] = L"cmd.exe /c tree";

    if (!CreateProcess(NULL, para, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
    {
        cout << "创建进程失败!" << endl;
        return FALSE;
    }

运行完CreateProcess之后出现提示:
Tree Walk Utility已停止工作

如果sa.bInheritHandle = TRUE, 就OK.

想请教个中原因, 不胜感激!

解决方案

问题在于,当你设定sa.bInheritHandle = FALSE;之后,你又试图做

si.hStdOutput = hWrite;
si.hStdError = hWrite;

解决方案二:

windows核心编程中有讲,SECURITY_ATTRIBUTES 中的bInheritHandle如果为TRUE表示继承,否则不继承!规定如此

时间: 2024-11-08 17:50:46

创建子进程句柄继承问题的相关文章

Python 创建子进程模块subprocess详解_python

最近,我们老大要我写一个守护者程序,对服务器进程进行守护.如果服务器不幸挂掉了,守护者能即时的重启应用程序.上网Google了一下,发现Python有很几个模块都可以创建进程.最终我选择使用subprocess模块,因为在Python手册中有这样一段话: This module intends to replace several other, older modules and functions, such as: os.system.os.spawn*.os.popen*.popen2.*

windows、linux创建子进程

在windows下创建子进程较常用到的API就是CreateProcess,可以通过以下的方式启动一个新进程:       STARTUPINFO si = {0};                 PROCESS_INFORMATION pi = {0};     si.cb = sizeof(STARTUPINFO);         //结构体大小    GetStartupInfo(&si);                       //初始化结构    si.wShowWindow

android studio-AS怎么创建一个有继承父类的类??

问题描述 AS怎么创建一个有继承父类的类?? 在eclipse中建立class有supperclass选项 但是android studio里中没有supperclass这个选项.如图所示,那么我想要在AS里创建一个有继承父类的类要怎么创建??? 解决方案 这么久了,还是没人回答,,,同问 解决方案二: 不能,只能手动extends继承

小结Python用fork来创建子进程注意事项_python

自己随手写了Python下 fork 进程的测试代码(来说明这个问题不一定完全合适): def fork(a): def now(): import datetime return datetime.datetime.now().strftime("%S.%f") import os import time print now(), a if os.fork() == 0: print '子进程[%s]:%s' % (now(), os.getpid()) while 1: a-=10

Nginx学习笔记(七) 创建子进程

Nginx创建子进程 ngx_start_worker_processes位于Nginx_process_cycle.c中,主要的工作是创建子进程. 在Nginx中,master进程和worker进程是通过socketpair函数创建一对socket来实现,父进程与子进程之间的通信的.而这对socket被保存在进程结构体ngx_process中的channel[2]数组中,其中channel[0]为父进程的socket,channel[1]为子进程的socket. static void ngx

Linux学习之创建子进程

#include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <math.h> /* 进程创建 */ void main(void) {pid_t child;int status; printf("This wi

Linux中使用C语言的fork()函数创建子进程的实例教程_C 语言

一.fork入门知识一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事. 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同.相当于克隆了一个自己.   我们来看一个例子: #include <unistd.h> #include &l

【操作系统】linux创建子进程--fork()方法

(1)fork()的定义 fork()函数是Unix中派生新进程的唯一方法,声明如下:   [cpp] view plaincopy   #include <unistd.h>      pid_t fork(void);   我们需要理解的是,调用一次fork()方法,该方法会返回两次.一次是在调用进程(也就是派生出的子进程的父进程)中返回一次,返回值是新派生的进程的进程ID.一次是在子进程中返回,返回值是0,代表当前进程为子进程.如果返回值为-1的话,则代表在派生新进程的过程中出错.  

UC编程6-目录操作和创建子进程fork()函数1

//myuc.h #include<stdio.h>//io流 #include<stdlib.h>//标准库 #include<unistd.h>//uc标准头文件 #include<fcntl.h>//文件控制 #include<string.h>//c字符串 #include<sys/types.h> #include<sys/mman.h>//内存映射 #include<sys/stat.h>//文件状