
1、父进程
指已创建一个或多个子进程的进程。在UNIX里,除了进程0以外的所有进程都是由其他进程使用系统调用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。
2、子进程
指的是由另一进程(对应称之为父进程)所创建的进程。子进程继承了对应的父进程的大部分属性,如文件描述符。在Unix中,子进程通常为系统调用fork的产物。在此情况下,子进程一开始就是父进程的副本,而在这之后,根据具体需要,子进程可以借助exec调用来链式加载另一程序。
扩展资料
父子进程之间的关系
1、关于资源
子进程得到的是除了代码段是与父进程共享的意外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,既然为副本,也就是说,二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行。
2、关于文件描述符
继承父进程的文件描述符时,相当于调用了dup函数,父子进程共享文件表项,即共同 *** 作同一个文件,一个进程修改了文件,另一个进程也知道此文件被修改了。
参考资料来源:百度百科-父进程
参考资料来源:百度百科-子进程
引入的原因: 用于控制向多个进程进行信号的分发,发给一个进程组是信号会发生给进程组中每一个进程
会话是一个或者多个进程组的集合,进程调用 setsid 函数建立一个会话。
进程调用setsid函数建立一个新的会话,会发生下面几件事
守护进程是生存期长的一种进程,没有控制终端。他们常常在系统引导装入时启动,系统关闭是终止。守护进程程序通常以字母 d 结尾。
用户层的守护进程的父进程是 init 进程。内核的守护进程并非init进程。
以 &方式运行的为后台进程
比如: ping www.baidu.com &
通过 jobs 命令查看
将后台程序放到前台
通过 control+c 命名发送’hupinit‘信号kill掉进程
终端被挂断或者用户注销,SIGHUP信号会被发送到该终端相关的控制程序,而SIGHUP的默认行为是终止程序的运行。
需要实现终端退出后进程依然在后台运行,有两种途径
如果setid函数的进程就是一个进程组的组长,则函数会返回出错。为了解决这样情况,通常函数需要先fork,然后父进程退出,由子进程执行setsid。由于子进程继承的是父进程的进程组ID,而其PID是新分配的ID,因此这两者不可能相等,即子进程不可能是进程组的组长。 这种情况下,由于父进程先于子进程退出,因此子进程的父进程会有init进程接管。 而这就是sid命令的实现原理。
设置 setsid www.baidu.com
我们对比下和nohup
我们可以看到setsid的父进程变成了init进程。由于会话和父进程和shell无关了,因此无论如何shell都无法向该进程发送SIGHUP命令
fork()函数,Linux系统调用头文件:
#include <unistd.h>
函数定义:
int fork( void )
返回值:
子进程中返回0,父进程中返回子进程ID,出错返回-1
函数说明:
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的“副本”,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。
‘fork()’函数用于从已存在进程中创建一个新进程。新进程称为子进程,而原进程称为父进程。你可以通过检查‘fork()’函数的返回值知道哪个是父进程,哪个是子进程。父进程得到的返回值是子进程的进程号,而子进程则返回0。以下这个范例程序说明它的基本功能: //------------------------------ example 1 pid_t pid
switch (pid = fork())
{
case -1:
/* 这里pid为-1,fork函数失败 */
/* 一些可能的原因是 */
/* 进程数或虚拟内存用尽 */
perror("The fork failed!")
break
case 0:
/* pid为0,子进程 */
/* 这里,我们是孩子,要做什么? */
/* ... */
/* 但是做完后, 我们需要做类似下面: */
_exit(0)
default:
/* pid大于0,为父进程得到的子进程号 */
printf("Child's pid is %d\n",pid)
}//------------------------------ example 2#define TRUE 1
while (TRUE){ /* repeat forever */
type_prompt() /* display prompt on the screen */
read_command(command, parameters) /* read input from terminal */
if (fork() != 0){/* fork off child process */
/* Parent code. */
waitpid(1, &status, 0) /* wait for child to exit */
} else {
/* Child code. */
execve(command, parameters, 0) /* execute command */
}
}
这些是我再网上帮你找到的资料,看完之后,自己也学到不少,呵呵 ^^
希望它对你有点帮助吧,好好体会
还有一点就是进程的定义:进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。说白了进程就是正在运行的程序,比如说有程序 p1 和 p2,当程序p1运行是就是进程p1 ,如果正在运行的是p2,那么就是进程p2
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)