二、通过系统调用创建进程 fork:创建子进程 fork之后有两个执行分支,fork之后代码共享,也就是说fork之后的代码父进程和子进程都会执行。下面的5986进程就是bash进程。...我们也可以看到,其中父子进程fork的返回值是不一样的,父进程fork返回的是子进程的pid,子进程返回的是0。 那这里就会有疑问了,为什么fork给父进程返回子进程的pid,给子进程返回0?...原因是fork本身是一个系统调用函数,fork内部本身也会有很多代码的,当fork函数执行到最后return pid的时候,它的核心工作已经做完了,子进程其实已经被创建出来了,return pid也是一条语句...这和linux中的虚拟地址有关,也就是说,一个变量可以指向不同的地址空间。 写实拷贝 任意进程之间是具有独立性的,不会互相影响。...进程都有自己的代码和数据,系统创建出来的子进程的PCB默认就会指向父进程的代码和数据,想让父子进程分别执行不同的程序,那就可以在代码中根据父子进程fork返回值的不同设置ifelse语句,让父子进程分别执行不同的代码
那我们可以查一下: 上面父进程的PID是18791 我们看到PID为18791的对应的是-bash 那bash是啥? 是不是Linux上的命令行解释器啊,这个我们之前学过。...原因很简单,因为bash怕我们自己写到程序有问题,有bug。 所以bash就创建子进程去执行来保证自己的安全。...我们kill之后会发现bash就不能正常工作了 那出现这种情况的话我们把xshell关掉重新登陆就行了。 bash创建子进程去帮它执行命令,那下一个问题,如何创建子进程呢? 3....那当然这里19559对应的肯定就是bash了 那对上面做一个简单的总结: 如果没有fork的话,那程序运行起来就只有一个进程,这个进程是bash的子进程,那就只有一个执行流,所以两个printf就都只打印一次...失败的话,-1在父进程中返回,不会创建任何子进程,并且正确设置了errno(C语言中一个用于表示错误码的全局变量,Linux内核是C语言写的)。 也就是说fork成功的话,返回值会有两个。
/helloworld &方式后台运行,当连接终端的网络出现问题,那么也会导致运行程序中断。这些因素对于长期运行的服务来说很不友好,而「守护进程」可以很好的解决这个问题。...1、创建子进程,父进程退出 进程 fork 后,父进程退出。...这个步骤主要是要与继承父进程的会话、进程组、终端脱离关系。 3、禁止子进程重新打开终端 此刻子进程是会话组长,为了防止子进程重新打开终端,再次 fork 后退出父进程,也就是此子进程。...由于使用 fork()函数新建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为 0,可以大大增强该守护进程的灵活性。...6、关闭文件描述符 子进程会继承已经打开的文件,它们占用系统资源,且可能导致所在文件系统无法卸载。此时守护进程与终端脱离,常说的输入、输出、错误描述符也应该关闭。
前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎!...——bash命令行解释器与bash进程 当我们运行一个进程时,命令行解释器会把这个指令解释成bash的子进程 接着再由这个bash的子进程执行对应的命令 当这个子进程出现问题时,并不影响bash的进程...即:每一条命令被执行,都属于bash的子进程 我们执行一段代码,parent对应的是getppid()函数; 我们接着用ps+grep过滤指令查看这个16815进程,发现其就是bash进程...二.fork( )函数原理与应用详解 1.fork()函数基本介绍 fork(): 创建子进程 返回值给 【父进程返回子进程PID,给子进程返回0】 2.fork()返回值有两个:——>变成了两个进程...返回不同的返回值,是为了 区分 为了让fork以后的if判断while等,来让父子进程执行 不同 的代码片段 4.为什么fork要给子进程返回0,给父进程返回子进程pid?
一般不会出现。...可以看到,杀掉了bash进程后,ssh链接就断开了 守护进程(daemon) 守护进程这个词经常听到,名字还挺温暖,遗憾的是总是在处理linux挖矿病毒的案例中听到,简直破坏美感 守护进程的一个特点就是进程不受任何终端控制...,步骤如下: 直接摘抄吧: 执行一个fork(),之后父进程退出,子进程继续执行。...这样就确保了子进程不会成为会话组长,因此根据System V中获取终端的规则,进程永远不会重新请求一个控制终端。(多一个fork()调用不会带来任何坏处。)...无标准输入、无标准输出、无标准错误 ppid=1 现在更像是守护进程了,但是PID,PGID,SID还是不相等,终端处值不为 ?
证明:常显示的命令输入提示符就是 bash 不断打印输出的结果 输入指令后,bash 会创建子进程,并进行程序替换 证明:运行自己写的程序后,可以看到当前进程的 父进程 为 bash 此时可以断定神秘的...bash 就是一个运行中的进程,因为进程间具有独立性,因此可以同时存在多个 bash,这也是多用户登录 Linux 可以同时使用 bash 的重要原因 系统自带的 bash 是一个庞然大物,我们只需根据其本质...---- 2、需求分析 bash 需要帮我们完成命令解释+程序替换的任务,因此它至少要具备以下功能: 接收指令(字符串) 对指令进行分割,构成有效信息 创建子进程,执行进程替换 子进程运行结束后,父进程回收僵尸进程...不过还存在一些不足,比如 ls 命令显示文件无高亮、cd命令无法切换、环境变量无法添加至子进程等,这些问题都可以通过特殊处理避免 ---- 5、特殊情况处理 对特殊情况进行处理,使 myBash 更加完善...) 对于当前的 myBash 来说,cd 没有丝毫效果,因为此时 指令会被拆分后交给子进程处理,这个方向本身就是错误的 特殊情况特殊处理,同 ls 高亮一样,对指令进行识别,如果识别到 cd 命令
在父进程中,fork返回新创建子进程的进程ID 在子进程中,fork返回0 如果出现错误,fork返回一个负值 其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程...id, 因为子进程没有子进程,所以其fpid为0....这里对我们对fork的执行过程进行解释一下,来看它究竟做了哪些操作。 当你调用fork函数时,linux底层究竟怎样进行怎样的操作?为此,我查看linux内核0.11版本的源码来理解。...当命令参数为NULL时返回1,如果不为NULL,则fork一个子进程,fork失败则返回-1。...如果成功,就调用execl,路径是”/bin/sh”,一般这个会软链接到bash上,所以子进程就变成了一个shell进程。
bash就是命令行解释器 ,每启动一个XShell就会有一个bash进程启动,所以输入的指令等信息都是通过父进程bash处理的,所以当使用命令行启动多个进程后可以发现它们的父进程(PPID)都是bash...监控和调试:对于系统管理员和开发者来说,通过查看cwd可以了解进程是在哪个目录下运行的,这对于调试程序(特别是当程序试图访问文件时出现路径错误等问题)和监控进程行为非常有用。...fork() 是 Linux 中用于创建新进程的函数。...得到的运行结果如下: 可以看出,在fork();执行后出现了两个进程,其中一个进程的pid是fork前的进程的pid,一个是新进程的pid。此时就成功的创建了子进程。但是要如何使用fork()呢?...我的pid:%d,我的父进程id:%d\n",getpid(), getppid()); } } 运行结果如下: 在fork()执行后创建了子进程,并且同上文所讲相同,父进程的父进程是bash进程
什么是僵尸进程与孤儿进程 在 linux 系统中,进程都是由父进程创建的,当父进程执行 fork 系统调用完成子进程创建后,子进程和父进程就独立存在了,但两者又有着密切的关系,按照标准的流程,父进程要在子进程完成执行后...4.4 fork 两次 在建立子进程时,使用 2 次 fork,让所建立的子进程成为父进程的孙子进程,而实际中的子进程则随即推出,和第三条相同,由于孙子进程的父进程已经退出,所以在孙子进程会被自动过继给守护进程...但这么做的问题在于,Bash 不会将信号转发给子进程,也就是说,当我们要结束 docker 时,只有 bash 进程会被终止,而他的子孙进程的资源将无法得到有效回收。...另一方面,通过 bash 创建出来的进程,无论其执行结果如何,bash 都会以 0 作为返回状态退出,这样一来,如果实际执行的子进程是异常崩溃,我们就没有办法获取到这个进程的返回码了,而 docker...也会因为错误地判断了进程的执行状态而执行错误的重启策略,因为在 docker 看来,ENTRYPOINT 进程永远都是正常退出的,因为它返回了 0。
最近在项目中有使用 subprocess 这个模块,它的功能主要是fork一个子进程,并且运行一个外部的程序。说白了就是可以用这个模块可以根据输入的字符串执行对应的系统 shell 指令。...linux下,默认是 /bin/bash universal_newlines参数,如果把 universal_newlines 设置成True,则子进程的 stdout 和 stderr 被视为文本对象...Popen.pid,获取子进程的进程ID。 Popen.returncode, 获取进程的返回值。如果进程还没有结束,返回None。...有效值为 PIPE、现有文件描述符(正整数)、现有文件对象和无。...进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
04.通过系统调用创建进程-fork初识 在 Unix 和类 Unix 系统(如 Linux)中,fork() 是一种系统调用,用于创建一个新的进程,这个新的进程被称为子进程。...如果出现错误,如内存不足,fork() 只会在父进程中返回一个负值,并且不会创建子进程。...在子进程中,fork() 返回 0。 如果出现错误,如内存不足,fork() 只会在父进程中返回一个负值,并且不会创建子进程。...在父进程中,fork() 返回子进程的PID。 在子进程中,fork() 返回0。 错误处理: 如果 fork() 返回-1,表示创建子进程失败,程序返回1并终止。...错误返回:如果 fork() 调用失败(例如,由于系统资源不足或超过了系统允许的进程数),则它只会在父进程中返回 -1,并且不会创建子进程。在此情况下,通常使用 errno 获取错误的具体信息。
fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process)。...我们知道一个程序可以多次加载到内存,成为同时运行的多个进程,例如可以同时开多个终端窗口运行/bin/bash,另一方面,一个进程在调用exec前后也可以分别执行两个不同的程序,例如在Shell提示符下输入命令...ls,首先fork创建子进程,这时子进程仍在执行/bin/bash程序,然后子进程调用exec执行新的程序/bin/ls,如下图所示。...一、fork系统调用 包含头文件 和 函数功能:创建一个子进程 函数原型 pid_t fork(void); 参数:无参数。...而这个时候父进程的内存已经完全被写坏。 (5)、fork之后父子进程共享文件 ? 子进程继承了父进程打开的文件描述符,故每个打开文件的引用计数为2。
如何创建一个进程 实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux内核并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。...当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。 ...-bash 23774 16939 ps -o pid,ppid,cmd 我们可以看到,第二个进程bash是第一个进程sudo的子进程,而第三个进程ps是第二个进程的子进程。 ... │ ├─bash───pstree │ ├─gnome-pty-helpe │ ├─sh───R───{R} │ └─3*[{gnome-terminal}] fork通常作为一个函数被调用...子进程的终结(termination) 当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在内核里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为>0的整数
【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学习Ⅲ-环境变量 【Linux】进程理解与学习Ⅳ-进程地址空间 浅谈Linux下的shell--BASH 【Linux】进程优先级...进程创建 再谈fork函数 #include pid_t fork(void); 返回值:创建子进程成功后,给子进程返回0,父进程返回子进程的pid,出错返回-1 pid_t...而exit可以说是_exit的封装,如下: 退出结果 对于一个进程的退出结果,无非就以下三种情况: 程序正常退出,且执行结果正确 程序正常退出,且执行结果错误 程序异常 进程退出的进一步理解...,子进程是要让父进程拿到自己的退出码以及退出状态,否则就算自己被kill掉了,也是处于一种僵尸状态(Z状态)存在着,直到父进程拿到自己的退出码以及退出状态,子进程才结束僵尸状态(bash的子进程由于bash...有回收机制,所以不会出现僵尸进程)。
\n"); } 代码本身是没有什么错误的,但是打印出来的时候,会发现打印出来并不是一个父进程一个子进程的打印,因为子进程会执行父进程后面的代码,所以也会执行这个死循环,从而导致子进程创建子进程,变成了指数级别的增长.../test,每个进程的pid都是会变化的) 那么什么是bash呢? 当我们运行: 就会有bash提示你说,./是个目录,无法运行。 其实bash就是命令行解释器,我们刚才运行的....翻译过来就是,成功创建子进程,那么子进程的Pid就会返回给父进程,0返回给子进程,失败了就是返回-1给父进程,也就是说,成功了会有两个返回值,我们就可以写如下代码: 7 pid_t id = fork...在fork的函数体内,已经创建了子进程,所以会返回两份id,因为父进程也会进入fork函数,那么有了两份id,至于为什么会有“两份”,埋个伏笔~ 所以得出结论,子进程的创建是用来干其他事情的,不是用来干和父进程一样的事情的...而当你对某一个进程进行cd的时候,发现是可以cd进去的,说明进程本质就是一个一个的目录,目录里面记录了进程的所有信息,此时,对于Linux中一切皆文件的理解又更深了一层! 感谢阅读!
Linux内核中提供了以下6种namespace隔离的系统调用 namespace 系统调用参数 隔离内容 UTS CLONE_NEWUTC 主机名与域名 IPC CLONE_NEWIPC 信号量、消息队列...()的一种变种,fork()是一种创建自身进程副本的操作,clone()可以通过flags参数来控制使用多少功能 fork()在父进程中返回新创建子进程的进程ID,在子进程中返回0,出现错误返回负值...()创建子进程继续执行命令,让原进程结束运行 加入namespace后可以通过引入execve()函数执行用户命令(调用/bin/bash 接收参数,运行起一个shell) unshare(.../bin/bash root@69aa00d7aa3b:/data# echo $$ 18 root@69aa00d7aa3b:/data# exit exit [root@cf proc]# echo...接下来的创建子进程才会在新的namespace。
Linux专项 1.概念引入 2.进程相关 2.1.fork引入 2.2.僵尸进程和孤儿进程 2.3.父进程回收子进程(wait and waitpid) 2.3.1.wait 2.3.2.waitpid...匿名管道(常用) 匿名管道读写操作 非阻塞管道(简写法) 2.4.4.进程间通信~FIFO有名管道 无血缘关系通信 有血缘关系通信 下集预告 Linux专项 先写几个问号来概况下今天准备说的内容:(谜底自己解开.../master/python/5.concurrent/Linux/base (linux/unix)操作系统提供了一个 fork()系统调用。...为了便于区分,操作系统是这样做的:子进程永远返回0,而父进程返回子进程的ID 查看下帮助文档: import oshelp(os.fork)Help on built-in function fork...() # 子进程被父进程fork出来后,在fork处往下执行 if pid == 0: print("子进程:PID:%d,PPID:%d" % (os.getpid(), os.getppid
如何创建一个进程 实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux内核并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。...当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。...bash 23774 16939 ps -o pid,ppid,cmd 我们可以看到,第二个进程bash是第一个进程sudo的子进程,而第三个进程ps是第二个进程的子进程。...子进程的终结(termination) 当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在内核里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为>0的整数)...所以,进程是Linux程序的唯一的实现方式。 总结 程序,进程,PID,内存空间 子进程,父进程,PPID,fork, wait 觉得本文对你有帮助?请分享给更多人。
如何创建一个进程 实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux内核并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。...当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。...-bash 23774 16939 ps -o pid,ppid,cmd 我们可以看到,第二个进程bash是第一个进程sudo的子进程,而第三个进程ps是第二个进程的子进程。...子进程的终结(termination) 当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在内核里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为>0的整数...所以,进程是Linux程序的唯一的实现方式。 总结 程序,进程,PID,内存空间 子进程,父进程,PPID,fork, wait
【Linux】进程控制 1、进程创建 在Linux中创建进程的话通常也就两种方式,一个方法是创建可执行程序,然后通过我们的./的操作让进程创建。...fork返回值返回两次,对于父子进程返回的值不相同,如果需要,我们可以通过if,else来分流,让父子进程在拥有相同代码的基础上实现不同的任务。子进程fork返回0,父进程返回值是子进程的PID。...所以进程调用到fork的时候内核就需要这样做, 1、分配新的内存块和内核数据结构给子进程 2、将父进程的部分数据结构内容拷贝至子进程 3、添加子进程到系统进程列表中 4、fork返回,开始调度器调度...表示的是父进程bash获取到的最近一个子进程退出的退出码(子进程的return值)。...所以父进程bash为什么要得到子进程的退出码呢?那就是为了是否成功,如果失败的情况之下,能够得到具体失败的原因。所以即使是得到失败的原因又能怎么样呢?不能怎么样,但是得到错误码能够为用户负责。