4.1 进程的秘密(父子进程,exec函数族,守护进程)

父子进程:
    1,Linux下创建进程的函数为fork();被创建的进程为子进程,发起创建的进程为父进程;他们共用所有资源.通过创建函数子进程函数fork的返回值区分;PID为0,为子进程,大于0为父进程.
    2,子进程创建后,对于fork()的返回值,父进程返回子进程的PID,子进程返回0;通过getpid()可以获取当前进程pid,通过getppid()获取当前进程的父进程的pid.
    3,通过vfork()也可创建子进程,与fork()不同的时,fork()是复制父进程的所有资源,vfork()是共享父进程的所有资源.fork()的父子进程随机运行;vfork的父子进程中,子进程优先运行,运行完后必须通过exit(0)退出,父进程才能继续运行,负责父子进程会被锁死.

exec函数族:
    1,使用fork()创建的子进程,所有资源是复制父进程的;因此让程序运行另外一个程序,这里引进了exec函数族,除PID外替换掉旧的所有资源;这就可以产生一个完全不同与父进程的子进程.
    2,exec函数族共有6个函数可使用,按传输参数类型可分为l和v;按是否传输路径信息为有p和无p;按是否配置新的环境变量为有e和无e.

守护进程:
    1,守护进程是一类在后台工作的特殊进程,守护进程脱离终端运行,不受外部的因素的变化而变化.
    2,创建守护进程是一个固定的流程:
        (1).创建子进程,父进程退出
        (2).在子进程中创建新会话,使用函数setsid();
        (3).改变工作目录,使用函数chdir();
        (4).重设文件权限掩码,使用函数umask();
        (5).关闭文件描述符,使用函数getdtablesize();


进程函数:
    fork():
    vfork():
        //头文件为 <sys/types.h> <unistd.h>
        //无参数,返回值为PID
        //fork 共用父进程的环境,随机运行;
        //vfork 共用父进程地址空间,子进程优先运行;
    getpid()
    getppid():
        //头文件为 <sys/types.h> <unistd.h>
        //pid获取当前进程ID
        //ppid获取当前进程的父进程ID
    exit():
        //头文件为 <stdlib.h>
        //用于退出进程,通过输入不同参数,按不同状态退出.
    _exit():
        //头文件为 <unistd.h>
        //无参数,直接使进程停止.
    wait()
    waitpid():
        //头文件为 <sys/types.h> <wait.h>
        //wait参数为指针,可以保存结束时的状态;用来回收子进程资源.
        //waitpid 可以按参数pid输入值回收一个子进程资源.
        //wait(NULL)等价于waitpid(-1,NULL,0)

exec函数族函数:
    execl(path,list)
    execlp(file,list)
    execle(path,list,环境变量向量表)
    execv(path,向量表)
    execvp(file,向量表)
    execve(path,向量表,环境变量向量表):
        //头文件为 <unistd.h>
        //l表示按顺序传参,每个成员按逗号分格,最后用NULL结尾;
        //v表示按指针数组的方式传参,最后用NULL结尾;
        //有p 形参为file,调用该函数,只需提供文件名,系统会按照环境变量$PATH内容自己搜索;
        //无p 形参为path,在调用该程序时,需要提供完整的路径信息;
        //有e 通过环境变量向量表传入当前进程的环境变量
        //无e 使用系统环境变量

守护进程相关函数:
    setsid():
        //头文件为  <sys/types.h> <unistd.h>
        //无参数,创建新会话
    chdir():
        //头文件为  <unistd.h>
        //参数为改变的工作路径,
    umask():
        //头文件为  <sys.types.h> <stat.h>
        //参数为设定的文件权限掩码,常用0;
    getdtablesize():
        //头文件为  <unistd.h>
        //无参数,返回值为当前进程打开的文件描述符总数
    mkdir():
        //头文件为 <sys/stat.h>
        //创建文件目录,并添加权限如mkdir(目录,0777);    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux操作系统中,shell是一种命令行解释器,负责解析用户输入的指令并执行相应的操作。当shell启动一个子进程时,子进程会创建一个新的进程空间,这个新的进程空间是独立于进程的,因此子进程不会继承进程的资源。 首先,子进程不会继承进程的文件描述符。文件描述符是用于标识打开的文件或其他I/O设备的整数。在进程中打开的文件描述符对于子进程来说是不可见的,子进程需要重新打开文件或使用dup()和dup2()函数复制进程的文件描述符。 其次,子进程不会继承进程环境变量环境变量是一组键值对,它们存放了一些系统和用户相关的信息。在进程中设置的环境变量对于子进程来说是不可见的,子进程需要自己设置环境变量或通过使用exec()系列函数调用其他程序。 另外,子进程的工作目录也不会继承进程的工作目录。工作目录是指程序运行时的当前目录,决定了相对路径的解析。在进程中改变的工作目录对于子进程来说是不可见的,子进程需要自己通过chdir()函数改变工作目录。 最后,子进程不会继承进程的信号处理方式。信号是一种软件中断,用于通知进程发生了某个事件。在进程中设置的信号处理函数对于子进程来说是不可见的,子进程需要自己设置信号处理方式。 综上所述,shell子进程不继承进程的资源,包括文件描述符、环境变量、工作目录和信号处理方式。子进程需要重新打开文件、设置环境变量、改变工作目录和设置信号处理方式,以完成自己的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值