当前位置: 首页 > 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.xdnf.cn/news/868213.html

相关文章:

  • 爬虫学习记录day1
  • Git Github Gitee GitLab
  • [特殊字符] 深度剖析 n8n 与 Dify:使用场景、优劣势及技术选型建议
  • 常用的Docker命令
  • 得物GO面试题及参考答案
  • Quick UI 组件加载到 Axure
  • [杰理]蓝牙状态机设计与实现详解
  • Android 3D球形水平圆形旋转,旋转动态更换图片
  • (2025)Windows修改JupyterNotebook的字体,使用JetBrains Mono
  • 【计算机网络】第3章:传输层—TCP 拥塞控制
  • MaskSearch:提升智能体搜索能力的新框架
  • Qwen3与MCP协议:重塑大气科学的智能研究范式
  • 文献分析指令
  • SSM spring Bean基础配置
  • 代理ip的原理,代理ip的类型有哪些?
  • Vue全局事件总线
  • 【Cursor】开发chrome插件,实现网页tab根据域名分组插件
  • 区块链+AI融合实战:智能合约如何结合机器学习优化DeFi风控?
  • 使用 React Native 开发鸿蒙(HarmonyOS)运动健康类应用的系统化准备工作
  • Moticon智能鞋垫传感器OpenGo如何提升神经病学步态分析的精准性
  • 比较运算符:==、!=、>、<、>=、<=
  • 机器学习与深度学习10-支持向量机02
  • DAY43 复习日
  • 【和春笋一起学C++】(十七)C++函数新特性——内联函数和引用变量
  • [Java 基础]注释
  • 【LLMs篇】13:LLaDA—大型语言扩散模型
  • 省赛中药检测模型调优
  • 深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
  • 物联网控制技术期末复习 知识点总结 第二章 单片机
  • 【Hive入门】