使用CreateProcess()启动进程时出现问题

时间:2009-09-14 14:48:40

标签: c winapi createprocess

问题是这样的:

  

使用Win32 API中的CreateProcess()。在这种情况下,您需要指定一个从CreateProcess()调用的单独程序。正是这个单独的程序将作为输出Fibonacci序列的子进程运行。执行必要的错误检查以确保在命令行上传递非负数。

我做了以下事情。它不显示任何错误消息。当我尝试执行它时,它会自动退出:

#include <sys/types.h>
#include <windows.h>
#define _WIN32_WINNT 0x0501

#include <stdio.h>

int main()
{

  STARTUPINFO si;   
  PROCESS_INFORMATION  pi;   
  int a=0, b=1, n=a+b,i,ii;  

  ZeroMemory(&si, sizeof(si));

  si.cb = sizeof(si);


  if(! CreateProcess("C:\\WINDOWS\\system32\\cmd.exe",NULL,NULL,NULL,FALSE,0,
                     NULL,NULL,&si,&pi))
    printf("\nSorry! CreateProcess() failed.\n\n");
  else{    
    printf("Enter the number of a Fibonacci Sequence:\n");
    scanf("%d", &ii);

    if (ii < 0)
      printf("Please enter a non-negative integer!\n");
    else
    {         
      {
         printf("Child is producing the Fibonacci Sequence...\n");
         printf("%d %d",a,b);
         for (i=0;i<ii;i++)
         {
            n=a+b;
            printf("%d ", n);
            a=b;
            b=n;
         }
         printf("Child ends\n");
      }

      {
         printf("Parent is waiting for child to complete...\n");
         printf("Parent ends\n");
      }
    }
  }

  WaitForSingleObject(pi.hProcess, 5000);    
  printf("\n");

  // Close process and thread handles.    
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);

  return 0;
}

我做错了什么?

3 个答案:

答案 0 :(得分:2)

我认为你误解了你的运动。此外,您可能希望在使用CreateProcess时执行句柄继承。这可能高于您的技能水平,但仍然是一个有用的教训: http://support.microsoft.com/kb/q190351/

答案 1 :(得分:0)

为什么要调用cmd.exe作为您的流程?问题表明,正在启动的过程应该是打印Fibonacci序列。你不应该在主进程/应用程序中这样做。

你应该拥有的是一个单独的程序,它接受一个参数并打印斐波那契序列中的许多项目。主程序应该向用户索要一个号码,然后通过传递这个号码作为参数来启动另一个程序。

答案 2 :(得分:0)

问题是产生一个输出Fibonacci序列的过程。获取/验证主进程中的用户输入,然后生成另一个程序(单独编写)以打印Fibonacci序列。将用户输入作为命令行参数传递给生成的进程。