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

Linux 创建进程执行任务的实现方法

Linux 操作系统紧紧依赖进程创建来满足用户的需求。例如,只要用户输入一条命令,shell 进程创建一个新进程,新进程运行 shell 的另一个拷贝并执行用户输入的命令。...Linux 系统中通过 fork/vfork 系统调用来创建进程。本文将介绍如何使用 fork/vfork 系统调用来创建进程并使用 exec 族函数在新进程中执行任务。...通常将原有的进程称为父进程,把新创建进程称为进程进程是父进程的一个拷贝,进程获得同父进程相同的数据,但是同父进程使用不同的数据段和堆栈段。...exec 族函数 使用 fork/vfork 创建进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),进程往往需要调用一个 exec 族函数以执行另外一个程序。...本文试图通过简单的 demo 来演示这些函数的基本用法,为理解 Linux 系统中父进程进程的概念提供一些直观的感受。

3.8K11

Linux下1号进程的前世(kernel_init)今生(init进程)----Linux进程的管理与调度(六)

前面我们了解到了0号进程是系统所有进程的先祖, 它的进程描述符init_task是内核静态创建的, 而它在进行初始化的时候, 通过kernel_thread的方式创建了两个内核线程,分别是kernel_init...用kernel_init函数,kernel_init一个让人感兴趣的地方在于它会调用run_init_process来执行根文件系统下的 /sbin/init等程序: kernel_init 0号进程创建...由0号进程创建1号进程(内核态),1号内核线程负责执行内核的部分初始化工作及进行系统配置,并创建若干个用于高速缓存和虚拟主存管理的内核线程。...init进程 随后,1号进程调用do_execve运行可执行程序init,并演变成用户态1号进程,即init进程init进程linux内核启动的第一个用户级进程。...init同样也收集孤立的进程:当一个进程启动了一个进程并且在进程之前终止了,这个子进程立刻成为init进程

3.8K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    subprocess:Python中创建进程

    前言 subprocess库提供了一个API创建进程并与之通信。这对于运行生产或消费文本的程序尤其有好处,因为这个API支持通过新进行的标准输入和输出通道来回传数据。...returncode为进程的退出状态码。通常情况下,退出状态码为0则表示进程成功运行了;一个负值-N表示这个子进程被信号N终止了。...该函数还有许多参数,比如shell,默认值为False表示直接运行命令,如果主动赋值为True则会创建一个中间shell进程,由这个进程运行命令。...这就是subprocess库创建进程的通信机制) 需要注意的是,如果需要抑制输出效果,可以将stdout与stderr设置为subprocess.DEVNULL。...连接管道段 在Linux系统中,我们可以将多个命令连接成一个管线,即可以把它们的输入输出串联在一起。

    52370

    linux:根据主进程查找进程

    本文链接:https://blog.csdn.net/10km/article/details/100603320 如下是我的项目中创建的一个java系统服务在通过systemctl status显示的服务状态...,进程ID分别为1088,1482,1494,从左到右为父/进程关系.如果想通过netstat命令根据PID查找服务所占用的端口,就需要最右的java进程ID。...怎么样通过这个MainPID获取实际工作的进程ID呢,ps的 -g选项可以根据PID过程要显示的所有属于指定PID的进程进程,比如: $ ps --forest -o pid,cmd -g 1088...target/start_facelog_server.sh 1494 \_ java -jar facelog-service-2.4.2-standalone.jar 最后一行就是最后的进程...main_pid="$(systemctl show $service_name --property=MainPID)" main_pid=${main_pid##*=} # ps 命令获取最下层的进程

    4.9K20

    linux进程创建进程终止

    01.进程创建 #include pid_t fork(void); 返回值:自进程中返回0,父进程返回进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后...,内核做: 分配新的内存块和内核数据结构给进程 将父进程部分数据结构内容拷贝至进程 添加进程到系统进程列表当中 fork返回,开始调度器调度 写时拷贝 02.进程终止 首先想清楚,终止是做什么...,父进程获取到的是最近一个进程退出的退出码,前面我们提到,echo是内建命令,打印的都是bash内部的变量数据 父进程bash为什么要得到进程的退出码呢?...这个退出码是一个整数,传递给父进程,用于表示进程的终止状态。 常见惯例: 0(EXIT_SUCCESS):通常表示成功。程序执行完成且没有错误。...使用场景主要是在创建进程后,进程完成任务立即退出时,或者在程序遇到无法恢复的错误需要立即终止时使用。 使用 exit() 当你需要正常终止程序,并且需要清理资源(如关闭文件、保存状态等)。

    9310

    linux内核学习(三)之init进程学习(上)

    上次讲解到linux内核启动分析的前期准备,还没有去分析linux内核具体启动分析过程,这里我换一种方式来分享,在linux启动后,linux系统接下来会如何进行工作?...一、init进程完成了从内核态向用户态的转变: 1、一个进程2种状态: 这里所说的一个进程两种状态,说的是进程状态的转换;首先在介绍这种状态的转换之前,我们来了解一下什么是init进程,它其实是linux...系统在启动后运行的第一个进程(这里关于进程的学习,可以去看我之前分享的linux应用编程专辑,有很详细的介绍);而init进程刚开始运行的时候是内核态,它属于一个内核线程,然后他自己运行了一个用户态下面的程序后把自己强行转成了用户态...init进程大部分有意义的工作都是在用户态下进行的。init进程对我们操作系统的意义在于:其他所有的用户进程都直接或者间接派生自init进程。 4、如何从内核态跳跃到用户态?还能回来不?...,比如我们在windows任务管理器里面就可以看到如下图所示: 在我们linux系统里面的话,在init进程转换为用户状态下后,后面有一些我们比较熟悉的进程操作:login进程、命令行进程、shell

    1.6K20

    LinuxLinux进程控制>进程创建&&进程终止&&进程等待&&进程程序替换

    1.进程创建 1.1 fork函数 在linux中fork函数时非常重要的函数,它从已存在进程创建一个新进程。...fork代码后,内核做: 分配新的内存块和内核数据结构给进程 将父进程部分数据结构内容拷贝至进程 添加进程到系统进程列表当中 fork返回,开始调度器调度 当一个进程调用fork之后,就有两个二进制代码相同的进程.../a.out #等20秒退出 child exit code:10 [root@localhost linux]# ....\n"); return 1; } } return 0; } 运行结果: 4.进程程序替换 4.1 替换原理 用fork创建进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支...调用exec并不创建进程,所以调用exec前后该进程的id并未改变 4.2 替换函数 其实有六种以exec开头的函数,统称exec函数 #include ` int execl(const

    15210

    Linux系统进程编程之回收进程(三)

    那么说了这么多,我们该怎么样来回收Linux系统的僵尸进程呢?...返回值是进程的ID,当前父进程有可能有多个子进程,wait函数阻塞直到其中一个进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个进程本次被回收了: wait(): on success...#include 7 static void sig_child(int signo); 8 9 int main() 10{ 11 pid_t pid; 12 //创建捕捉进程退出信号...此时如果父进程执行waitpid时进程已经先结束等待回收则waitpid直接回收成功,返回值是回收的进程的PID; 如果父进程waitpid时进程尚未结束则父进程立刻返回(非阻塞),但是返回值为...上面的源代码链接:https://github.com/1121518wo/linux-/tree/master

    3.4K20

    Linux进程与可执行程序的关系&&fork创建进程&&写实拷贝的理解

    二、通过系统调用创建进程 fork:创建进程 fork之后有两个执行分支,fork之后代码共享,也就是说fork之后的代码父进程进程都会执行。下面的5986进程就是bash进程。...原因是在进程中,一个父进程可能会有多个子进程,父进程想要管理进程必须通过进程的标识符,所以父进程必须知道子进程的标识符,而进程只需要关心自己是否成功创建了,所以返回0。...这和linux中的虚拟地址有关,也就是说,一个变量可以指向不同的地址空间。 写实拷贝 任意进程之间是具有独立性的,不会互相影响。...创建一个进程的时候,系统中就会多一个进程,当进程创建时,系统就必须为进程创建出一个全新的PCB(task_struct),父进程会把自己PCB中很多内容拷贝给进程的PCB,也就是说,进程创建,...进程都有自己的代码和数据,系统创建出来的进程的PCB默认就会指向父进程的代码和数据,想让父子进程分别执行不同的程序,那就可以在代码中根据父子进程fork返回值的不同设置ifelse语句,让父子进程分别执行不同的代码

    18010

    Linux系统编程】通过系统调用获取进程标识符 及 创建进程(fork)

    bash创建进程去帮它执行命令,那下一个问题,如何创建进程呢? 3....那这也证实了它们两个是父子进程关系,fork的作用就是创建当前进程进程,而PID为30455的这个进程就是被创建进程。...,它肯定跟前面那个相同,因为执行第一个打印的时候还没有执行fork()创建进程呢。...失败的话,-1在父进程中返回,不会创建任何进程,并且正确设置了errno(C语言中一个用于表示错误码的全局变量,Linux内核是C语言写的)。 也就是说fork成功的话,返回值会有两个。...那这样就做到了在数据层面上也可以实现进程间的独立性。 所以,可以理解为: 当进程创建时,起初操作系统只为其分配一个新的进程控制块(PCB),用于维护进程的相关信息。

    34410

    php中pcntl_fork创建进程

    一、php中pcntl_fork函数概述 pcntl_fork()函数是php中用于创建进程的一个函数,返回创建进程的pid。...该函数创建进程具体fork的过程: (1)调用该函数即创建一个进程创建成功父进程返回进程的pid,进程返回0; (2)创建进程实际上对父进程的一个拷贝,共享代码空间,拷贝父进程的数据,也就是说父进程改变父进程的数据...$curr_pid.PHP_EOL; //开始创建进程 $son_pid = pcntl_fork();//返回进程的id //查看当前进程 echo '创建进程之后当前的进程为...示例代码分析: (1)发现创建进程之后,系统会切换到进程中,而进程中的代码是从含有pcntl_fork函数的那行执行的 (2)创建进程之后,进程的代码段是拷贝pcntl_fork函数及之后的代码段...例如监控工具,想要监控几个不同指标的情形,可以使用主进程监控各指标的配置变化,然后对每个指标分别fork一个进程来监控其具体的情形,当主进程发现指标的配置改变则kill掉之前的进程重新创建进程进行监控

    1K21

    Linux创建进程

    Linux的下是由父进程来完成的,创建完成的新进程进程对于进程它有两种执行顺序的可能性: 父进程进程并发执行; 进程先执行,父进程等待进程执行完毕。...在Linux下的fork函数用于创建一个新的进程,使用fork()的函数来创建一个进程时,进程只是完全复制父进程的资源。这样得到的进程和父进程是独立的,具有良好的并发性。...Linux的采用了copy-on-write技术(COW),即:只有在进程中发生写入操作的时候,才真正的去复制父进程的资源,否则不进行复制操作,比如在fork的进程中只是调用exec函数来执行另外一个可执行文件...总结一下:fork函数创建进程是父进程的复制,进程和父进程并发执行来段代码测试一下。...除了fork之外,Linux的系统还提供了vfork的函数来建立一个新进程.vfork建立的新进程和fork的不同之处在于: vfork创建进程和父进程是共享地址空间的,而不是复制,因此进程中的数据和父进程中的数据是共享的

    2.1K10

    Linux进程概念(二.查看进程、父进程进程进程状态详解)

    2.父进程进程 2.1介绍 在操作系统中,当一个进程(称为父进程创建另一个新进程(称为进程)时,父子进程之间建立了一种特殊的关系。...PID关系: 进程的PID(进程标识符)是由父进程调用fork()或类似系统调用创建的。 进程的PPID(父进程标识符)与创建它的父进程的PID相同。...几乎所有进程都是由其他进程创建的,因为通常情况下,操作系统启动时会先创建一个初始进程(通常是init进程或systemd),然后其他进程都是由这些初始进程创建的。...这是因为在 Unix-like 系统中,进程是通过复制父进程的地址空间而创建的,因此进程从父进程继承了大部分的内存布局和数据。...fork函数为什么会返回两次:fork 函数在调用后会创建一个新的进程(在return之前就已经创建进程了),新的进程拥有父进程的副本。

    1.4K10

    Linux进程控制】五、wait()函数——进程回收

    僵尸进程与孤儿进程 孤儿进程:父进程结束,进程init进程收养。 僵尸进程进程结束,父进程没有回收进程的资源(PCB),这个资源必须要由父进程回收,否则就形成僵尸进程。...ID在3秒后变成了1,这说明父进程结束后,它变成了孤儿进程,并被init进程收养,使用kill命令基于可以杀死孤儿进程。...方法就是杀死父进程,父进程被杀死后,由init接管子进程并回收进程资源。...父进程调用wait()函数可以回收进程终止信息,wait()函数功能主要有三个:阻塞等待进程退出;回收进程残留资源;获取进程退出状态(退出原因)。...3.1 使用wait()回收多个子进程 首先使用wait()函数来回收多个子进程,我们可以在一个for循环中等待进程的结束,创建了几个子进程就for循环等待几次,代码如下。

    8310

    Linux进程——进程创建(fork的原理)

    查看进程的第二种方法 在Linux系统中,不只有ps能够查看进程,还存在着一个动态目录proc,该目录存放了所有存在的进程,目录的名称。它会随着进程的改变而随时更新它的内容!...创建进程 2.1 系统调用函数fork 在Linux中,进程创建方式有两种: 命令行中直接启动进程 通过代码创建 而在用代码创建进程时,实则是进行了系统调用,这里我们就得在学习一个系统调用函数...首先我们来思考以下问题: 那么我们为什么要创建进程进程的作用是啥?...fork创建进程,系统中会多一个进程 以父进程为模板,为进程创建PCB 但是你今天创建进程,是没有代码和数据的!!!目前和父进程共享代码和数据!!...创建完成进程,只是一个开始,创建完成进程之后,系统的其他进程,父进程进程,接下来要被调度执行的,当父子进程的PCB都被创建并在运行队列中排队的时候,哪一个进程的PCB先被选择调度,那个进程就先运行

    19210

    init进程启动过程

    init进程是由多个源文件共同组成的,源码目录在system/core/init中。 源码分析 main(入口函数) Linux内核加载完成后,在系统文件中寻找init.rc文件,并启动init进程。...init进程创建进程ueventd,并将创建设备节点文件的工作交给veventd。veventd通过两种方式创建设备节点文件(冷启动和热启动)。 FirstStageMain。启动第一阶段。...僵尸进程 在Unix/Linux中,父进程fork创建进程,在进程终止后,如果父进程不知道子进程已经终止了,这时进程虽然退出了,但是系统进程表还保留它的信息,这个子进程就被称为僵尸进程。...fork用于创建一个进程(复制调用fork进程的堆栈等信息),它与原进程(调用fork进程)同时运行,原进程称为父进程。fork不需要参数并返回一个返回值。...负值:创建进程失败 零:返回到新创建进程 正值:返回父进程,该值包含创建进程进程ID 源码路径:system/core/init/sigchld_handler.cpp void ReapAnyOutstandingChildren

    40120
    领券