3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。 4、重定向孙子进程的标准输入流,标准输出流,标准错误到/dev/null #!...(会话组头领进程)退出,这意味着一个非会话组头领进程永远不能重新获得控制终端。 ...,在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。...,fork孙子进程处理, 6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null 因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了,所以都转向到
进程终止 退出码 在写C/C++的时候,我们在main函数是程序的开始,但是最后一个位置会写return 0; 这也就代表一个程序的退出,至于为什么要写return 0,而不是返回其他的,亦或者是不写都可以...这个之前用过: 然后来看看里面数字对应的错误信息 注意:如果程序异常退出码也无意义。 常见的退出方式 上面说了在mian函数中调用return就是进程退出。...C语言和操作系统还提供了两个函数退出进程: 这是C语言提供的一个函数,只要使用就会退出当前进程,参数是退出码。 无论是在哪个位置,或者是后面有多少代码。...阻塞与非阻塞 阻塞 父进程一直在等子进程结束回收资源。 非阻塞 父进程一段时间过来看一下子进程是否结束,如果没结束可以做其他事情,这个叫轮询方式。...,我们在输入ls什么的时候不同文件会有颜色,但是如果调用exec里面就需要自己添加颜色选项,我们又不能在屏幕输入,所以只能在代码中添加,首先判断一定要是ls命令才行,然后添加颜色选项。
文件名 # 1,如果文件不存在,创建文件,进行编译 # 2,打开文件后不能进行编辑,因为处于命令模式 # 3,按insert或i,进入编辑模式 # 4,编辑完成后,按ESC退回到命令模式 # 5,输入...强制退出,不保存 2,tar -zxvf 压缩文件命令 PlainBashC++C#CSSDiffHTML/XMLJavaJavascriptMarkdownPHPPythonRubySQL # z:...PlainBashC++C#CSSDiffHTML/XMLJavaJavascriptMarkdownPHPPythonRubySQL #查看Java进程 ps -ef | grep java #停止进程...kill -9 java进程序号 4,启动java程序,后台运行 PlainBashC++C#CSSDiffHTML/XMLJavaJavascriptMarkdownPHPPythonRubySQL...以下方法可让jar运行后一直在后台运行。
假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。...重定向孙子进程的标准输入流,标准输出流,标准错误到/dev/null 完成上面的4个步骤,那么最终的孙子进程就称为守护进程,先看下代码,后面分析下步骤的原因。 #!...shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响,在程序里fork子进程后,父进程退出,对于shell进程来说,这个父进程就算执行完毕,而产生的子进程会被init...2.修改子进程的工作目录 子进程在创建的时候会继承父进程的工作目录,如果执行的程序是在U盘里面,就会导致U盘不能卸载。...为了避免这个问题,fork孙子进程处理, 6.重定向孙子进程的标准输入流,标准输出流,标准错误流到/dev/null 因为是守护进程,本身已经脱离了终端,那么标准输入流,标准输入流,标准错误流就没有什么意义了
技术应用角度的信号 接下来我们了解一下,键盘数据是如何输入给内核的,ctrl + c 又是如何变成信号的。 首先我们需要知道,键盘被按下,肯定是操作系统先知道,因为键盘设备并不能被进程直接访问。...其实键盘上的按键是有分类的,有的是用来输入的,有的是用来控制的,比如 ctrl + c、z等,所以操作系统在拷贝数据的时候会进行判断,输入的是数据还是控制,如果是控制,会转化为相应的信号发送给进程!...因为至始至终,进程引发了硬件异常问题,也没有修正问题,所以硬件异常一直存在,随着进程被调度,上下文错误也一直存在,所以操作系统一直检测到有这个异常,就一直给该进程发信号,而我们也一直在捕捉这个信号没有处理...不一定,比如我们之前学的管道,当读端关闭后,写端一直在写入的时候,操作系统就会因为效率问题关掉写端,并给写端发送 SIGPIPE 13号信号,这就算一种软件异常。...用来表示进程退出时的退出码;而一旦异常了会收到退出信号,退出信号是低七位比特位;而还有一位是 core dump,我们并没有介绍,而这个字段就是当进程在终止的时候,这个标志位只有一个比特位,为0或者1,
当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。...我们创建进程为的就是让他完成某种任务,但是我们该如何知道它是否成功完成,因此在进程退出时,需返回一些退出信息来表明任务得完成情况 比如: 我们之前所学习得main都要有return 0,这也是返回退出信息的一种...因此我们可以知道:当进程退出但是还没被读取退出信息时处于僵尸状态 PCB释放: 当一个进程在退出的时候,退出信息会由OS写入到当前退出进程的PCB中,可以允许进程的代码和数据空间被释放,但是不能允许进程的...开个玩笑,孤儿进程是父进程在子进程退出之前就先退出了,此时的子进程就称为“孤儿进程” 但是前面刚刚讲过一个进程在死亡时,PCB的死亡信息必须被读取后,才会释放PCB,但是如果父进程已经退出了,子进程的...3.3 修改进程优先级 当我们想要修改进程优先级时: 输入top,启动任务管理器 按r(renice)来修改NICE的值 再输入目标进程的pid 输入想要修改的NICE值 我们通过视频来直观了解一下
**SIGPIPE**:管道破裂信号,通常由写入关闭管道的进程触发。 常见的信号忽略 在 C/C++ 中,信号忽略是一种控制信号行为的机制,允许进程对某些信号采取不处理的方式,即忽略这些信号。...**SIGTERM**:SIGTERM 是一个请求终止进程的信号,通常用来请求程序优雅退出。如果你希望程序在收到 SIGTERM 信号时不退出,可以选择忽略它。...TcpClient.cc 修改成多次可以使用服务的 连续输入 读写出错进行重连 守护进程 前台进程 后台进程 后台进程不能标准输入 3个后台进程了 把2号任务提到前台进程 ctrl c终止前台进程 把任务提到前台进程...当用户退出登录时,该会话会结束。 2. 进程会话(Process Session) 在Linux中,每个进程都有一个会话(Session),这个会话由session leader(会话领导进程)控制。...,那些任务仍然在 bash也退了,然后就托孤了 受到了用户登录和退出的影响 守护进程化---不想受到任何用户登陆和注销的影响 如何做到(setsid) 怎么保证自己不是组长 守护进程本质(孤儿进程) 代码
**SIGTERM**:SIGTERM 是一个请求终止进程的信号,通常用来请求程序优雅退出。如果你希望程序在收到 SIGTERM 信号时不退出,可以选择忽略它。...TcpClient.cc 修改成多次可以使用服务的 连续输入 读写出错进行重连 守护进程 前台进程 后台进程 后台进程不能标准输入 3个后台进程了 把2号任务提到前台进程... 守护进程本质(孤儿进程) 守护进程忽略的几个信号和含义 在 C/C++ 中,守护进程通常会忽略一些信号,确保其在后台继续运行,而不被用户的操作或其他系统事件干扰。...忽略这些信号有助于确保进程不被意外终止,可以持续运行。 如何在 C/C++ 中忽略信号? 在 C/C++ 中,您可以使用 signal() 函数来捕获或忽略信号。...这是因为守护进程一般不希望占用当前工作目录,并防止在程序退出时当前工作目录被锁定。如果设置为 1,则守护进程的当前工作目录不会改变。
进程与线程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种一个程序在一个数据集上的一次动态执行过程就称之为进程。...因为进程还是有缺陷的: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行...在调用任何Python C API之前,要先获得GIL GIL缺点:多处理器退化为单处理器;优点:避免大量的加锁解锁操作 Python的多线程:由于GIL锁,导致同一时刻,同一进程只能有一个线程被执行...总结: 对于计算密集型任务(一直在使用CPU):python的多线程并没有用 对于IO密集型任务(存在大量IO操作):python的多线程是有意义的 要想使python使用多核:只能开进程, 弊端:开销大而且切换复杂...当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成 想退出时,会检验子线程是否完成。
容器日志 上面的示例我们创建了一个 docker 的守护式进程,进程里面一直在使用 while 进行循环输出 hello world,为了探究容器内部都在做什么,我们使用docker logs 命令来获取容器的日志...我们在日志的循环输出中加了几个空行,能让你直观的感受到我们正在监控 docker 日志的运行过程,你可以使用 control + c 来退出监控。...其实可以看到,日志一直在循环输出,没有显示之前的日志信息。 为了让调试更加简单,我们可以使用 -t 来为每条日志加上时间戳,如下 ?...执行命令后,我们看到容器内的所有进程,运行进程的用户,时间,执行指令 容器内部运行进程 在 Docker 1.3 之后,我们可以通过 docker exec 命令在容器内部额外启动新进程。...STDIN是标准输入,一般指键盘输入到缓冲区里的东西。
当我们去掉printf后,进程始终都在运行状态里,所以最终查出来的状态是运行状态(R状态)。 休眠状态本质就是进程在等待“资源”就绪 当程序正在运行时,如果ctrl+c,进程被终止,称为可中断睡眠。...这么一看,操作系统、进程、磁盘好像都没有错,是制度的问题,当进程在向磁盘中写入数据时谁都不能将该进程干掉。于是D状态就诞生了。...当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。...,在自己的进程task_struct会记录自己的退出信息,未来让父进程来进行读取。...孤儿进程 僵尸进程代码中是子进程先退出,父进程一直运行 在孤儿进程中,让父进程先退出,子进程一直运行 代码: #include #include
前言: 通过我们之前所学Linux知识以及C语言的知识,到目前为止,我们完全可以独立完成简易shell的制作,那么话不多说,开始今天的话题!...在 Shell中,一行命令输入完成之后将直接生效。...其实这是因为我们一直是在使用子进程执行命令的,所以仅仅是子进程一直在切换目录,父进程的目录却一直不变。 所以向cd 这种命令,我们就不能交给子进程操作,而这样的命令我们称为 内建命令。 ...在执行命令之前,检测输入的命令是否是内建命令,如果是,则处理内建命令,如果不是则直接跳过,执行其他命令。 ...这个命令,这个命令需要显示上一个进程的退出码,而获取进程的退出码,这个时候我们就需要先在全局范围内设置退出码变量: int lastcode = 0;//退出码 退出码是在执行完进程之后返回的结果,
这篇文章主要为大家详细介绍了Linux守护进程的启动方法,本文介绍如何将一个 Web 应用,启动为守护进程,感兴趣的小伙伴们可以参考一下 "守护进程"(daemon)就是一直在后台运行的进程(daemon...但是,一旦你退出命令行窗口,这个应用就一起退出了,无法访问了。 怎么才能让它变成系统的守护进程(daemon),成为一种服务(service),一直在那里运行呢?...因此,后台任务的所有输出依然会同步地在命令行下显示。不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。...可以看到,"后台任务"与"前台任务"的本质区别只有一个:是否继承标准输入。所以,执行后台任务的同时,用户还可以输入其他命令。 三、SIGHUP信号 变为"后台任务"后,一个进程是否就成为了守护进程呢?...用户准备退出 session系统向该 session 发出SIGHUP信号session 将SIGHUP信号发给所有子进程子进程收到SIGHUP信号后,自动退出 上面的流程解释了,为什么"前台任务"会随着
"守护进程"(daemon)就是一直在后台运行的进程(daemon)。 本文介绍如何将一个 Web 应用,启动为守护进程。 一、问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行。...但是,一旦你退出命令行窗口,这个应用就一起退出了,无法访问了。 怎么才能让它变成系统的守护进程(daemon),成为一种服务(service),一直在那里运行呢?...因此,后台任务的所有输出依然会同步地在命令行下显示。 不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。...可以看到,"后台任务"与"前台任务"的本质区别只有一个:是否继承标准输入。所以,执行后台任务的同时,用户还可以输入其他命令。 三、SIGHUP信号 变为"后台任务"后,一个进程是否就成为了守护进程呢?...$ nohup node server.js & nohup命令对server.js进程做了三件事。 阻止SIGHUP信号发到这个进程。 关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。
Linux 守护进程的启动方法 “守护进程”(daemon)就是一直在后台运行的进程(daemon)。 本文介绍如何将一个 Web 应用,启动为守护进程。...但是,一旦你退出命令行窗口,这个应用就一起退出了,无法访问了。 怎么才能让它变成系统的守护进程(daemon),成为一种服务(service),一直在那里运行呢?...因此,后台任务的所有输出依然会同步地在命令行下显示。 不再继承当前 session 的标准输入(stdin)。你无法向这个任务输入指令了。如果它试图读取标准输入,就会暂停执行(halt)。...可以看到,”后台任务”与”前台任务”的本质区别只有一个:是否继承标准输入。所以,执行后台任务的同时,用户还可以输入其他命令。 三、SIGHUP信号 变为”后台任务”后,一个进程是否就成为了守护进程呢?...$ nohup node server.js & nohup命令对server.js进程做了三件事。 阻止SIGHUP信号发到这个进程。 关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。
准备工作 先问大家一个问题:我们使用一个应用的时候,比如我们打开电脑上的爱奇艺看电影,那在看电影的过程中这个应用对应的进程是否是一直在不停的运行呢? ,那其实呢它并不是一直在不停运行的。...那这就取决于进程状态相关的概念。 那在正式学习进程状态之前,我们先来了解两个概念——阻塞和挂起。 2....这是我们之前讲过的。先搞一个结构体把它们的属性啥的都封装起来,然后在搞一个链表或其它高效的数据结构组织起来。 那进程呢?操作系统里面可能存在很多进程,那也要管理起来,如何管理?...所以这个进程并不是一直在CPU的运行队列里面的,而是在运行队列和外设资源的等待队列里面不断切换的。 那为什么我们查到的是S状态而不是R状态呢?...因为它此时正在等待资源啊 等待我们通过键盘输入数据。 所以它此时就不在CPU的运行队列里,没有被调度,而是在键盘资源的等待队列,那就是我们上面说的阻塞状态。
exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序; return():返回函数,若在主函数中,则会退出函数并返回一值。...2. return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束。 3. return是函数的退出(返回);exit是进程的退出。 ...4. return是C语言提供的,exit是操作系统提供的(或者函数库中给出的)。 ...非主函数中调用return和exit效果很明显,但是在main函数中调用return和exit的现象就很模糊,多数情况下现象都是一致的。...就是用来正常终止一个进程的,主要区别是_exit会立刻进入内核,而exit先执行一些清除工作(包括执行各种终止处理程序,关闭所有标准I/O等,一旦关闭了IO,例如Printf等函数就不会输出任何东西了)
领取专属 10元无门槛券
手把手带您无忧上云