21xrx.com
2024-11-05 20:34:31 Tuesday
登录
文章检索 我的文章 写文章
C++如何创建新进程?
2023-06-30 11:04:27 深夜i     --     --
C++ 创建 新进程

C++ 是一种面向对象编程语言,它提供了一些函数来创建新进程。在操作系统中,进程是执行的程序的实例。进程间通信是操作系统中很常见的一种行为,因此,了解如何在 C++ 中创建新进程是非常有用的。下面是创建新进程的一些方法。

1. fork() 函数

fork() 函数是 Unix 和类 Unix 操作系统中创建新进程的常用方法,它在 C++ 中也被支持。这个函数会在当前进程的地址空间中创建一个与之完全相同的副本,包括代码段、数据段、堆栈以及进程的上下文信息。在子进程中创建的新进程可以通过调用 exec() 函数来执行其他程序。以下是一个使用 fork() 函数来创建新进程的示例:


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

int main() {

  pid_t pid;

  pid = fork(); // 创建新进程

  if (pid == 0) { // 子进程

    printf("I am the child process.\n");

  } else if (pid > 0) { // 父进程

    printf("I am the parent process. My child's pid is %d.\n", pid);

  } else { // 出错

    fprintf(stderr, "Fork failed.\n");

    exit(-1);

  }

  return 0;

}

2. CreateProcess() 函数

在 Windows 平台上,CreateProcess() 函数是用于创建新进程的主要方法。该函数接受多个参数,包括要执行的程序名称、命令行参数、进程安全信息等等。以下是一个使用 CreateProcess() 函数来创建新进程的示例:


#include <iostream>

#include <windows.h>

using namespace std;

int main() {

  STARTUPINFO info = {};

  PROCESS_INFORMATION processInfo = {};

  if (!CreateProcess("notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo))

    cout << "CreateProcess failed." << endl;

    return -1;

  

  WaitForSingleObject(processInfo.hProcess, INFINITE); // 等待子进程结束

  CloseHandle(processInfo.hProcess); // 关闭进程句柄

  CloseHandle(processInfo.hThread); // 关闭线程句柄

  return 0;

}

3. popen() 函数

popen() 函数是另一种创建新进程的方法,它通过启动一个子进程,并打开一个管道来与子进程通信。该函数接受两个参数:要执行的命令和打开模式(“r” 表示只读,“w” 表示只写)。以下是一个使用 popen() 函数来创建新进程的示例:


#include <iostream>

#include <stdio.h>

using namespace std;

int main() {

  FILE *fp;

  char buffer[1024];

  fp = popen("ls -l", "r"); // 执行命令并打开管道

  if (fp == NULL) {

    cout << "popen failed." << endl;

    exit(-1);

  }

  while (fgets(buffer, sizeof(buffer), fp) != NULL) // 从管道中读取输出

    cout << buffer;

  

  pclose(fp); // 关闭管道

  return 0;

}

总之,上述方法演示了在 C++ 中如何创建新进程。这些方法可以帮助开发人员编写更复杂的程序,例如使用多进程进行并行计算。同时,这些方法也可以用于创建不同类型的应用程序,例如命令行工具和图形界面程序。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复