当前位置: 首页 > news >正文

Linux-linux和windows创建新进程的区别以及posix_spawn

Linux上创建一个新的进程可以使用fork函数,这个函数执行的效果是复制当前进程创建一个新的进程,这个进程执行的代码与父进程相同。通过fork返回的pid我们可以在fork后的代码中区分父进程和子进程需要执行的逻辑。示例代码如下:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main() {pid_t pid = fork();if (pid < 0) {fprintf(stderr, "Fork failed");return 1;} else if (pid == 0) {// 子进程代码printf("Child process (PID: %d)\n", getpid());} else {// 父进程代码printf("Parent process (PID: %d), Child PID: %d\n", getpid(), pid);}return 0;
}

而在window上,使用CreateProcess接口可以直接指定一个可执行程序路径创建新的进程,新进程的执行代码不在父进程中。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>void _tmain( int argc, TCHAR *argv[] )
{STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory( &si, sizeof(si) );si.cb = sizeof(si);ZeroMemory( &pi, sizeof(pi) );if( argc != 2 ){printf("Usage: %s [cmdline]\n", argv[0]);return;}// Start the child process. if( !CreateProcess( NULL,   // No module name (use command line)argv[1],        // Command line 这里指定程序路径NULL,           // Process handle not inheritableNULL,           // Thread handle not inheritableFALSE,          // Set handle inheritance to FALSE0,              // No creation flagsNULL,           // Use parent's environment blockNULL,           // Use parent's starting directory &si,            // Pointer to STARTUPINFO structure&pi )           // Pointer to PROCESS_INFORMATION structure) {printf( "CreateProcess failed (%d).\n", GetLastError() );return;}// Wait until child process exits.WaitForSingleObject( pi.hProcess, INFINITE );// Close process and thread handles. CloseHandle( pi.hProcess );CloseHandle( pi.hThread );
}

可以看到两者的不同之处:fork复制当前进程开启新进程,执行的代码都在父进程中,createProcess指定可执行程序从而开启新进程,执行代码的代码在指定的可执行程序中。那么在linux上如何实现类似createProcess的效果呢,一种是fork+exec:

pid_t parent = getpid();
pid_t pid = fork();if (pid == -1)
{// error, failed to fork()
} 
else if (pid > 0)
{int status;waitpid(pid, &status, 0);
}
else 
{// we are the childexecve(...);_exit(EXIT_FAILURE);   // exec never returns
}

exec函数族会替换当前的进程映像(process image),我的理解是相当于子进程变成了exec指定的新的可执行程序在执行。还可以使用posix_spawn函数,用法类似windows的createProcess:

pid_t pid;char *argv[] = {"ls", (char *) 0};int status;puts("Testing posix_spawn");fflush(NULL);status = posix_spawn(&pid, "/bin/ls", NULL, NULL, argv, environ);if (status == 0) {printf("Child id: %i\n", pid);fflush(NULL);if (waitpid(pid, &status, 0) != -1) {printf("Child exited with status %i\n", status);} else {perror("waitpid");}} else {printf("posix_spawn: %s\n", strerror(status));}

Linux设计上将“创建一个新进程”和“加载新的可执行程序到新的进程”两个步骤分离了,而windows的CreateProcess则是把两个步骤合并了。

  1. https://learn.microsoft.com/en-us/windows/win32/procthread/creating-processes
  2. https://stackoverflow.com/questions/5883462/linux-createprocess
  3. https://superuser.com/questions/1737519/why-a-fork-is-often-followed-by-an-exec
http://www.dtcms.com/a/231612.html

相关文章:

  • 04.两数之和
  • 数据库同步是什么意思?数据库架构有哪些?
  • 《AI角色扮演反诈技术解析:原理、架构与核心挑战》
  • Linux基础开发工具——yum工具
  • QML技术优势
  • day21 常见的降维算法
  • 英国2025年战略防御评估报告:网络与电磁域成现代战争核心
  • 【学习笔记】Python金融基础
  • Linux 云服务器部署 Flask 项目(含后台运行与 systemd 开机自启)
  • 智能推荐系统:协同过滤与深度学习结合
  • # Vue + OpenLayers 完整项目开发指南
  • 【unity游戏开发入门到精通——通用篇】从零掌握UnityWebRequest:文件下载、表单提交、超时处理、断点续传
  • Devops自动化运维---py基础篇一
  • Android Studio 打包时遇到了签名报错问题:Invalid keystore format
  • leetcode1443. 收集树上所有苹果的最少时间-medium
  • pyqt5 安装失败
  • C++课设:通讯录管理系统(vector、map协作实现)
  • ESP32S3 LVGL超大字体
  • Java中为什么要实现多线程
  • HarmonyOS-ArkUI核心API: UIContext
  • 发票识别查验难题
  • 乘用车自动驾驶和非乘用车(矿车,卡车)自动驾驶区别
  • 在 Windows 系统下配置 VSCode + CMake + Ninja 进行 C++ 或 Qt 开发
  • 平板电脑定制工厂详解:服务类型、定制流程与行业应用指南
  • python打卡day44
  • 企业的业务活动和管理活动是什么?-中小企实战运营和营销工作室博客
  • 水文流速监测中的雷达流速仪
  • 自动化测试工具playwright中文文档-------16.对话框
  • 【计算机组成原理 第5版】白、戴编著 第三章多层次的存储器 题型总结2 cache部分
  • 6.4 打卡