首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么子进程衍生可以在window上运行,但不能在ubuntu上运行?

子进程衍生(forking)是一种创建新进程的方法,它允许一个进程创建一个与自己几乎完全相同的副本。在不同的操作系统中,子进程衍生的实现方式可能会有所不同。

基础概念

  • Windows: Windows操作系统使用的是基于线程的进程模型,而不是基于进程的模型。在Windows中,CreateProcess函数用于创建新进程,但它并不提供类似于Unix/Linux系统中的fork系统调用。
  • Ubuntu (Linux): Linux操作系统使用的是基于进程的模型,fork系统调用是创建新进程的标准方式。fork会复制当前进程的所有资源,包括内存空间、打开的文件描述符等,并创建一个新的进程。

为什么子进程衍生可以在Windows上运行,但不能在Ubuntu上运行?

  1. API差异:
    • Windows: 使用CreateProcess函数来创建新进程。这个函数会为新进程分配独立的内存空间,并且不会复制父进程的内存。
    • Ubuntu (Linux): 使用fork系统调用来创建新进程。fork会复制父进程的所有资源,包括内存空间。这意味着在fork之后,父进程和子进程共享相同的内存地址空间,直到其中一个进程执行exec系列函数。
  • 内存管理:
    • Windows: 由于CreateProcess会为新进程分配独立的内存空间,因此在Windows上运行基于fork的代码可能会导致内存管理问题。
    • Ubuntu (Linux): fork会复制父进程的内存,这可能会导致大量的内存复制开销,特别是在内存占用较大的进程中。

解决方法

如果你需要在Ubuntu上实现类似于Windows上的子进程衍生功能,可以考虑以下几种方法:

  1. 使用exec系列函数:
    • 在Ubuntu上,可以使用forkexec组合来实现进程的创建和执行。fork创建子进程,然后子进程执行exec系列函数来加载并运行新的程序。
    • 在Ubuntu上,可以使用forkexec组合来实现进程的创建和执行。fork创建子进程,然后子进程执行exec系列函数来加载并运行新的程序。
  • 使用posix_spawn函数:
    • posix_spawn函数提供了一种更高级的方式来创建新进程,并且可以避免forkexec的组合使用。
    • posix_spawn函数提供了一种更高级的方式来创建新进程,并且可以避免forkexec的组合使用。

参考链接

通过以上方法,你可以在Ubuntu上实现类似于Windows上的子进程衍生功能,并解决相关的兼容性问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

改善Debian Linux软件包管理的七款工具

如果你运行Debian或它的衍生版本之一(比如Linux Mint或Ubuntu),迟早会遇到apt-get和dpkg,它们是主要的软件包管理命令。然而,这些只是最常见的Debian软件包工具。...这些年来,Debian实际上陆续推出了几十款让安装和配置软件包更容易的脚本和工具。 许多这样的脚本和工具可以帮助你创建软件包。而且,它们常常包括你在桌面工具中根本找不到的功能特性。 ?...顾名思义,cron-apt可以为你的系统调度定期下载,并通知可用更新版。用户往往每天更新一次。 然而要注意:cron-apt下载但不安装更新的软件包。...用apt-get安装前先运行它,对于尽量减少系统上的问题大有帮助,如果你深入“不稳定”或“试验型”软件包代码库,更是如此。 选择工具 上述工具没有一款对Debian软件包管理来说是绝对必不可少的。...许多用户只需用apt-get就能轻松搞定,偶尔使用dpkg清除系统上的软件包,或者安装手动下载的软件包。 然而,它们都方便。使用得当,它们可以节省时间和精力,一些工具可以帮助你避免常见问题。

1.7K30
  • 云存储硬核技术内幕——(26) 面壁十年图破壁

    在前面的实验中,我们利用docker拉起了一个busybox的容器,让我们接着做个实验: 首先,在hostos上用ps -A命令查看进程: 然后,我们在busybox容器上执行以下命令: ping...podman在CentOS8中,可以理解为docker的替身 (感兴趣的同学可以自行了解podman的主页:https://podman.io ) 原来,我们在busybox中执行的进程ping,是由docker...用pstree命令查看进程树,可以看到: 但是,我们也发现,容器中的命令只能在容器中有效,如busybox中运行的ping命令,其发起的IP地址是容器busybox本身的IP。...我们整理一下看到的事实: 容器中跑的进程,在HostOS上也可以看到; 容器中可以看到一个完整的文件系统; 容器对文件系统本身做的修改无法持久化; 这是为什么呢?...让我们做一个实验,在CentOS中拉取并运行一个ubuntu镜像: 通过命令 docker image inspect ubuntu:latest ,可以发现这些有用的信息…… 我们可以发现,这个

    28320

    PHP 这么拉?长连接都搞不了?说说 PHP 的 socket 编程

    一起使用,而且 PHP 只能在处理完请求后销毁资源关闭进程,所以也无法处理长连接业务,这些都是对 PHP 的误解,我想这种误解的形成可能与 PHP 的发展历史有关,实际上 PHP 能做的有很多,下面就先从...CGI 脚本的标准输出会重定向给 Web 服务器,服务器接到输出后返回给前端,这就是为什么早期的 CGI 模式下运行的 PHP 程序可以通过 echo 来返回结果的原因。...FastCGI 模式与 PHP-FPM 为了解决 CGI 模式下每次都要新建子进程并销毁子进程导致的性能低下问题,FastCGI 模式在 CGI 基础上做出了改进,这种模式下会预先创建出一些 CGI 进程常驻内存...这种模式根本上还是基于 CGI 模式衍生出来的,主要优化的是引入常驻内存特性以及多个 FPM 进程的管理,减少了频繁开启关闭进程带来的性能损耗,但由于 Web 服务器与 FPM 进程之间还是短连接,所以这种模式不支持与客户端的长连接...CGI 脚本,由于使用 setenv 设置了环境变量,所以在子进程中可以读取到环境变量并做出一些计算处理。

    11710

    Linux下进程相关知识

    运行ps命令查看正在运行的进程列表: ubuntu@ubuntu:~$ ps PID TTY TIME CMD 3309 pts/1 00:00:00 bash 3794...进程的细节 在我们深入了解进程的更多实际应用之前,我们必须了解它是什么以及它是如何工作的。 我们上面说过,进程是系统上正在运行的程序,更准确地说,它是系统分配内存、CPU、I/O以使程序运行的过程。...信号 信号是对进程的通知,告诉它发生了什么事情。 为什么有信号?...进程优先级 当你在电脑上同时运行多个程序时,比如Chrome、Microsoft Word或Photoshop,看起来这些进程是同时运行的,但事实并非如此。 进程使用CPU的时间,称为时间片。...我们可以控制我们的进程如何运行: 将工作发送到后台 在命令后添加&号将在后台运行该命令: sleep 1000 & sleep 1001 & sleep 1002 & 查看后台进程 将进程从后台移动到前台

    1.4K50

    献给 Debian 和 Ubuntu 用户的一组实用程序

    Debian-goodies – 给 Debian 和 Ubuntu 用户的实用程序 debian-goodies 包可以在 Debian 和其衍生的 Ubuntu 以及其它 Ubuntu 变体(如 Linux...该实用程序将查找哪些进程仍在使用旧版本的库,然后,你可以重新启动服务。...在进行库更新后,要检查哪些守护进程应该被重新启动,运行: $ sudo checkrestart [sudo] password for sk: Found 0 processes using old...例如,你可以从 Arch Linux 及其衍生版的 AUR 或者其它任何 AUR 帮助程序来安装,就像下面这样: $ yaourt -S needrestart 在 Fedora: $ sudo dnf...此实用程序将列出增强其它包但不是必须运行它的包。你可以通过 -ip 或 –installed-packages 选项来查找增强单个包或所有已安装包的软件包。

    74620

    Redis 设计 --- 持久化存储策略 以及 过期键删除策略

    非阻塞式 当创建 RDB 文件时,服务会 fork 一个子进程出来,在后台默默运行,不影响父进程继续服务 小知识 操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系...,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置 AOF AOF文件会保存服务器运行期间所执行的每一条有效的操作指令...,以命令追加的形式,保存在持久化文件中,但是随着执行的指令越来越多,AOF 文件的体积将变的越来越可观,于是衍生出了“AOF重写” AOF 重写 当触发 AOF 重写场景时,服务会 fork 一个子进程出来...,在后台默默运行,不影响父进程继续服务;这里与 RDB 原理不同的一点时,在 AOF 重写期间,父进程执行的指令依然会被追加到 AOF 重写文件中 [b.png] RDB 与 AOF 对比 AOF...Redis 通过严谨的错误检查(包括但不限于 入队检查 执行前检查)以及简单的设计(无视队列中的无效指令)来保证其一致性。

    1.1K20

    16 个有用的带宽监控工具来分析 Linux 中的网络使用情况

    ◆ 概述 为什么今天的网络这么慢?您是否在监控 Linux 网络带宽使用情况时遇到问题?如果你想可视化网络中正在发生的事情,以便了解和解决导致网络缓慢的任何原因,今天的工具可以帮助到你。...即使在系统重新启动后,您实际上也可以查看这些日志。...NetHogs – 监控网络流量带宽 NetHogs是一个类似于顶部的小型文本工具,用于监控 Linux 系统上运行的每个进程或应用程序的实时网络流量带宽使用情况。...CBM——(彩色带宽计) CBM是一个微型命令行实用程序,用于在 Ubuntu Linux 及其衍生产品(如 Linux Mint、Lubuntu 等)中以彩色输出显示所有连接设备上的当前网络流量。...它会生成有用的 HTML 报告,其中的信息包括但不限于 IP 地址和总带宽使用情况。它是一个方便的工具,用于监控单个网络上各个机器的 Internet 带宽利用率。 ◆ 12.

    11.5K31

    进程 (二).exec(1)

    前言 UNIX/Linux 是多任务的操作系统,那如何进行多任务处理呢,就是通过多个进程分别处理不同事务来实现 事实上一颗单核CPU,在一个时刻里只能处理一条指令,所以在微观的世界里只可能有一个进程正在运行...,那为什么是多任务的操作系统呢,那是由于操作系统将CPU时间分成很多的小时间片,并且将这些时间片分配给不同的任务,然后根据特定的方法在不同任务间进行快速的轮转(每一次切换任务都会对当前任务的进展进行保存...CPU就可以真实地进行并行处理,就好像多条流水线同时开工,在这里每个任务都可以看作是一个进程 上一篇中使用fork进行了子进程的创建,这时子进程还是一份父进程的拷贝,如果要让子进程可以完成父进程不一样的功能...用程序(z)替换 2.父进程等待子进程结束后,父进程才能结束 process进程:process.c 要求:里面sleep 3秒,要求打印出子进程的PID。...PID,和子进程退出的状态 else printf("wait error\n"); } else if(0 == fret) //fork返回值为0的时候代表子进程 { char

    42130

    能当主力,能入虚拟机,还能随时打包带走,Linux 就是这么强大

    通过这些技巧,我们实现的功能是:一台机器上,可以同时安装Windows跟若干Linux系统,Windows下可以通过虚拟机来运行位于本地磁盘的这些Linux系统,而这些Linux系统下也可以通过容器或者虚拟机的方式互相运行...并且这些系统可以非常方便地备份跟删除,也可以随时创建以及运行快照。并且这些Linux系统可以随时打包带走,只需要经过很少的修改,就能直接在U盘或者其他机器上运行。...首先需要做的是在A机器上给rootfs创建一个只读快照(注意下面命令是在A机器上执行的): btrfs subvolume snapshot -r / /ubuntu 注意上面命令中快照的名字要和目标子卷的名字相同...中的进程是互相之间看不到对方的,虚拟出来的环境乍看上去就跟在单独运行的一个系统一样,同样有PID为1的init进程,有自己一套独立的rootfs,等等。...这里还有一点小技巧是,如果嫌每次开容器都要把linux分区挂载到/mnt上太麻烦,可以在/var/lib/machines里面为每个系统新建一个目录,然后在fstab里面设置一下自动把相应的子卷挂载进去

    2.4K00

    Linux pwn入门教程之环境配置

    此外,若同时运行多个容器,为了避免端口冲突,在启动容器时,可以将命令docker run -it -p 23946:23946 ubuntu/17.04.amd64 /bin/bash 中的第一个端口号...接着我们打开32位的ida,载入一个后面会用于演示堆漏洞的程序heapTest_x86,在左侧的Functions window中找到main函数,随便挑一行代码按F2下一个断点。...需要注意的是此时heapTest_x86已经开始运行,我们的目标是附加到其运行的进程上,所以我们需要把断点设置在call ___isoc99_scanf等等待输入的指令运行顺序之后,否则由于计算机的运行速度.../heapTest_x86的进程上。 ? 此时EIP将指向vdso中的pop ebp指令上。 ? 这几行指令实际上是执行完sys_read后的指令,此处我们不需要关心它,直接按F9,选中标志会消失。...同样的,我们通过io.send()也可以向这个进程传递输入。我们使用io.send('1')告诉这个进程我们要选择选项1。这个时候我们切换到IDA窗口,发现IDA还是处于挂起状态,这是为什么呢?

    1.4K10

    【5分钟玩转Lighthouse】开车也能跑程序

    那么到底该如何优雅地在开车(骑车/游泳/喝奶茶)时依然保证程序运行不断呢? 解决这个问题的终极解决方案就是:在云服务器上执行需要长时间执行的程序。...版本的实例,这是Ubuntu最新的LTS(长期维护)版本,可以体验更多新特性,后续我们也会在这个系统上做些简单实验。...lh.png 我们创建完成后,可以在实例列表页面看到实例状态,当实例状态为运行中时,点击更多->管理即可进入管理页面了。...0x02 初体验 首先需要明确,通过在程序命令后添加&执行是完全达不到效果的,因为这只是设置再当前shell中后台运行而已,程序的进程仍然是当前shell的子进程,在当前shell退出(如Ctrl+D或断网时...它可以打开一个新的会话并把它关联到一个进程。这样运行的程序自然和当前的shell会话进程无关了,也不会受其进程生命周期的管理。通过setsid执行程序是后台运行某个程序的最简单的方式之一。

    4.7K4316

    操作系统作业:各大系统的区别

    Linux 内核版本就是Linux的核心版本 由官网 www.kernel.org 发布 Linux 发行版本就是各个公司的在Linux核心版本上就行包装,添加想要的内容,这就衍生出非常多的发行版本,如下图所示...譬如的redhat, CentOS, 红旗、Ubuntu等,这些都是的Linux衍生操作系统。...Linux系统一般有4个主要部分: 内核、shell、文件系统和应用程序 内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。...如下图所示:图片来源:CSDN 核心架构为Darwin架构,其中EFI指的就是EFI在概念上非常类似于一个低阶的操作系统,并且具有操控所有硬件资源的能力 Mac OS X的内核环境主要包括了Mach...图片来源:华为开发者文档 鸿蒙OS也是运行在Linux内核之上,但是是运行在Linux微内核之上,且使用自研编译器取代Java虚拟机。因此理论上,性能、稳定性和安全性高于安卓。

    97130

    记录Docker使用过程中遇到的难点和问题

    被打包的程序可以是一个操作系统,也可以是Nginx应用,也可以是PHP等任意一种“程序”,打包之后的镜像可以在任意一台安装了Docker的主机上,完美的运行。...镜像就类似我们常用的.exe文件,执行之后就产生了这个程序的进程,容器就类似这个进程,一个镜像可以被同时运行很多次,产生多个容器。...window下启动容器需要映射端口,host模式无法正常使用 4.关于容器 容器运行之后,会产生一个完整的服务器文件目录结构,针对运行的应用的不同,这个容器所带有的功能也不同(主要区别可exec...Docker docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。...1.性能 IO、网络,对于IO可以把容器的应用运行时IO的目录挂载到容器的外部目录。对于网络可以指定使用服务器本身的网络 --network host;

    1.5K20

    Docker 入门,学明白这一篇就够啦

    很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。...传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。...镜像运行起来产生了容器,可以说容器是镜像运行的进程载体。 -it 的选项是让容器显式的运行,且持久。 -d 的选项是让容器到后台自己玩去。...---- 小 tips 为什么说 docker 容器一定要勤于备份呢,因为 docker 容器被误删的风险是要比 VMware 要高的,这也是上一篇我为什么只说用 Ctrl+p+q 退出 docker...所以就衍生出各种备份方案。 Docker 也是如此,你就不怕哪天容器让人给删了吗?

    57832

    从 docker 到 runC

    下面我们用 ubuntu 镜像运行一个容器: $ docker run -id ubuntu bash 上图中黄线框起来的是几个主要的进程,它们之间是有父子关系的(systemd 没有出现在上图):...实际上,在容器启动的过程中,docker-runc 进程是作为 docker-containerd-shim 的子进程存在的。...docker-runc 进程根据配置找到容器的 rootfs 并创建子进程 bash 作为容器中的第一个进程。...为什么需要 docker-containerd-shim? 也许大家会问,为什么在容器的启动或运行过程中需要一个 docker-containerd-shim 进程呢?...事实上 docker-containerd-shim 的存在是非常有必要的,其目的有如下几点: 它允许容器运行时(即 runC)在启动容器之后退出,简单说就是不必为每个容器一直运行一个容器运行时(runC

    64060

    深入理解Node.js 进程与线程(8000长文彻底搞懂)

    ,进程之间是相互独立的,每个进程都有自己的 V8 实例、内存,系统资源是有限的,不建议衍生太多的子进程出来,通长根据系统* CPU 核心数*设置。...CPU 核心数这里特别说明下,fork 确实可以开启多个进程,但是并不建议衍生出来太多的进程,cpu核心数的获取方式 constcpus=require('os').cpus();,这里 cpus 返回一个对象数组...开启多进程时候端口疑问讲解:如果多个Node进程监听同一个端口时会出现 Error:listen EADDRIUNS的错误,而cluster模块为什么可以让多个子进程监听同一个端口呢?...子进程对象send()方法可以发送的句柄类型 net.Socket TCP套接字 net.Server TCP服务器,任意建立在TCP服务上的应用层服务都可以享受它带来的好处 net.Native C+...在Window环境下,libuv直接使用Windows的IOCP来实现异步IO。在非Windows环境下,libuv使用多线程来模拟异步IO。

    2.6K10
    领券