当前位置: 首页 > 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

相关文章:

  • 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
  • 美的地产集团官方网站建设/百度热议
  • 一键生成海报的网站/手机百度网盘网页版登录入口
  • wordpress 文本小工具栏/南宁百度seo价格
  • 徐州企业网站建设公司/搜狗网站收录提交入口
  • 个人微商城怎么开通/上海aso优化公司
  • 中国铁路建设投资公司网站熊学军/百度竞价代运营外包