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

相关文章:

  • ROS 2 环境下使用 Astra Pro 深度相机实现目标距离检测及远程可视化全流程总结
  • 卫星的“太空陀螺”:反作用轮如何精准控制姿态?
  • JavaWeb:前端工程化-ElementPlus
  • Python应用函数的定义与调用(一)
  • 嵌入式分析利器:DuckDB与SqlSugar实战
  • 前端组件推荐 Swiper 轮播与 Lightbox 灯箱组件深度解析
  • 半导体制冷片(Thermoelectric Cooler,TEC)
  • vue封装gsap自定义动画指令
  • JAVA容器
  • BERT vs Rasa 如何选择 Hugging Face 与 Rasa 的区别 模型和智能体的区别
  • 【拓扑】1639.拓扑排序
  • 六种高阶微分方程的特解(原创:daode3056)
  • 近端策略优化(PPO,Proximal Policy Optimization)
  • JavaScript 深入探索:高级应用与前沿技术
  • Java异步编程难题拆解技术
  • MySQL范式和反范式
  • 在 Windows 系统下配置 VSCode + CMake + Ninja 进行 C++ 或 Qt 开发
  • 【力扣】3403. 从盒子中找出字典序最大的字符串 I
  • Java 2D 图形变换方法
  • AI全链路赋能内容创作:电商新势力起飞
  • 让视觉基础模型(VFMs)像大语言模型(LLMs)一样“会思考”​
  • 第八部分:第六节 - 状态管理 (基础):协调多个界面的状态
  • 【Unity】R3 CSharp 响应式编程 - 使用篇(二)
  • 【HW系列】—内网被渗透的解决方案
  • 协议融合驱动效能跃升:Modbus转Ethernet IP的挤出吹塑机应用
  • 修改 Windows 10/11 的系统设置中显示的安装日期
  • 如何解决spring循环依赖
  • 还原Windows防火墙
  • 高效VLM:VisionZip
  • JavaWeb:前后端分离开发-登录认证