读书笔记-APUE第三版-(8)进程控制

读书笔记-APUE第三版-(8)进程控制

进程ID

每一个进程都有一个唯一的进程ID。几个特殊进程:

  1. 0号进程是内核进程,一般是调度进程swapper。
  2. 1号进程init,是用户进程(以root权限执行/sbin/init),负责初始化。
  3. 几个重要函数:getpid(进程ID)/getppid(父进程ID)/getuid(进程真有用户ID)/geteuid(进程有效用户ID)/getgid(进程真有用户组ID)/getegid(进程有效用户组ID)。

fork/exec/wait例程

fork家族函数用于创建子进程(父子进程关系下节详细介绍),子进程往往调用exec家族函数运行新程序(fork+exec操作在有些系统中被称为spawn孵化),而wait家族函数用于获取子进程终止状态。

system函数使用/bin/sh运行命令,下面是使用fork/exec/wait实现的简单版本号

#include<sys/wait.h>
#include<errno.h>
#include<unistd.h>
int system(constchar *cmdstring) /* version without signal handling */
{
    pid_t pid;
    int status;
    if (cmdstring == NULL)
        return(1); /* always a command processor withUNIX */
    if ((pid = fork()) < 0) {
        status = -1;
    } else if (pid == 0) { /* fork返回值为0,表示是在子进程中*/
        execl("/bin/sh", "sh","-c", cmdstring, (char *)0);
        _exit(127); /* execl error */
    } else { /* 在父进程中,fork返回子进程pid */
        while (waitpid(pid, &status, 0) < 0) {
            if (errno != EINTR) {
                status = -1; /* error other than EINTR fromwaitpid() */
                break;
            }
        }
    }
    return(status);
}

  1. fork函数一次调用,在父进程和自己成中两次返回,由于父进程能够fork多个子进程,所以设计成在父进程中返回子进程pid,而在子进程返回0,由于子进程能够通过getpid和getppid获取自身pid和父进程pid。常见应用场景是在网络编程中,父进程while循环监听用户请求,当接收到用户请求,fork出子进程进行处理。注:linux系统中,fork通过clone系统调用实现。
  2. waipid函数使用參数0等待指定子进程返回,wait函数家族包含wait(等待任一子进程返回)/waitpid(等待指定子进程&组返回,并能通过第三个參数设置堵塞选项)/waittid(进一步扩展,能获取导致进程终止的信号信息等)/wait3(还能够返回进程使用的资源)/wait4(其它wait函数的入口)。
  3. exec家族函数的作用是替换掉当前进程上下文(text/data/heap/stack等),运行新的程序(不会创建新进程)。exec家族函数包含execl/execlp/execle/execv/execvp/execve,各个函数主要差别在參数上,当中l表示是列表形式,v表示是指针数组形式,e表示环境变量,p表示命令參数是相对路径,会在PATH路径中搜索。

父子进程

子进程和父进程共享仅仅读的text段,针对bss段、对、栈,现代操作系统使用COW(copy-on-write)技术,仅仅有发生改变时,才会拷贝对应的内存页。

父子进程关系

子进程会继承父进程的大量属性,当中一些重要属性包含:真实/有效用户信息,进程组/会话信息,工作文件夹,环境变量,资源限制等。

父子进程最明显的差别是:子进程的tms时间统计信息被清零,子进程不会继承文件锁,未决闹钟&信号等(兴许章节讨论)。

子进程和父进程返回先后顺序是不确定的,假设用户程序对父子进程运行顺序有依赖,须要自行处理,比方使用信号实现等待通知机制等。

  1. 内核为每一个正在终止的进程保留了少量信息(pid,终止状态,CPU时间等),便于父进程获取其终止状态。
  2. 假设子进程在父进程之前结束,而父进程没有wait,子进程会变成僵尸进程。
  3. 假设父进程先结束,子进程的父进程会变成init进程(pid为1),所以假设要避免僵尸进程的产生,能够两次调用fork,即在子进程中再次调用fork,然后退出。这样第二个fork出来的进程因为其父进程退出,所以被init进程接管。

文件共享

子进程会dup父进程打开的文件描写叙述符(共享文件描写叙述符close-on-exec标记),包含标准输出、输入和错误输出。

<span>读书笔记-APUE第三版-(8)进程控制</span>

如图,父子进程共享file tableentry,位置偏移量一致,所以要父子进程读写同一文件时要注意同步。

设置进程用户ID

之前提到,子进程会继承父进程的uid和euid(有效用户ID),能够调用setuid(setgid)改动进程用户(组)。

  1. 假设是root用户调用,会同一时候改动进程的uid、euid和备份euid(saved set-user-id)。登陆后,由login(root进程)设置用户ID。
  2. 非root用户仅仅能改动euid,并且仅仅能改动成之前的uid或者备份euid,否则出错。
  3. 假设自进程运行exec方法,并且运行程序的set-user-ID位被设置,那么euid被设置被运行程序属主ID。
  4. 备份euid复制euid。正常情况下,uid=euid=备份euid。
  5. 程序编写遵循“最小权限“模型,当且仅当程序须要高权限时,才调用setuid提升权限,操作完之后再调用setuid恢复权限。

其它进程相关函数

  1. 进程审计:acct开启进程审计功能,系统记录已终止进程的统计信息,包含用户ID,启动时间,CPU时间等。Linux系统审计记录保存在/var/log/account/pacct,须要用fread读取acct结构体信息。
  2. 进程调度:进程调整nice值来设置执行优先级(你越nice,你的优先级越低,人艰不拆。。),相关函数:nice/getpriority/setpriority
  3. 进程时间:调用clock_t times(structtms *buf )函数,当中返回值为时钟时间,而tms结构体被下面内容填充:

struct tms {
    clock_t tms_utime; /* user CPU time */
    clock_t tms_stime; /* system CPU time */
    clock_t tms_cutime; /* user CPU time, terminated children */
    clock_t tms_cstime; /* system CPU time, terminated children */
};

注意:相关时间已经通过每秒滴答数(_SC_CLK_TCK)转化成了秒数,但它是从过去任一时间開始统计的,所以其绝对值无意义。一般分别在进程開始和结束调用times,再计算之间的时间差。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119231.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux系列之常用运维命令整理笔录

    本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新free-m其中:m表示兆,也可以用g,注意都要小写Men:表示物理内存统计total:表示物理内存总数(total=used+free)use…

    2022年4月7日
    40
  • rcep协议内容_ptp协议

    rcep协议内容_ptp协议展开全部(1)合同的含义合同是当事人或当事双方之间设立、变更、终止民事关系的协议。依法62616964757a686964616fe78988e69d8331333363373036成立的合同,受法律保护。合同具有如下法律特征:①合同是两个或两个以上的、法律地位平等的当事人意思表示一致的协议;②合同以产生、变更或终止债权债务关系为目的;③合同是一种民事法律行为。在合同中,一般用甲方、乙方来指代交易…

    2025年9月26日
    7
  • 基于情感词典进行情感态度分析[通俗易懂]

    基于情感词典进行情感态度分析[通俗易懂]情感分析是指挖掘文本表达的观点,识别主体对某客体的评价是褒还是贬,褒贬根据进态度行倾向性研究。文本情感分析可以分为基于机器学习的情感分类方法和基于语义理解的情感分析。基于机器学习进行语义分析的话需要大量的训练集,同时需要人工对其进行分类标注。我所使用的方法是基于语义理解中的使用情感词典进行情感态度分析。下面是我所使用的情感词典:链接:HTTPS://pan.baidu.com/s/1xC…

    2022年8月23日
    6
  • Java 创建文件软链接

    Java 创建文件软链接为什么要使用软链接:对文件进行移动复制粘贴,如果对文件实体进行操作的话,因为文件大小的原因会导致操作时长会很慢,而且占据内存。那么,如果使用文件的快捷方式去做文件操作会很快捷还省空间,这个快捷方式就是软链接。创建软链接的代码:Files.createSymbolicLink(FileSystems.getDefault().getPath(file.getAbsolutePath()),…

    2022年6月18日
    42
  • 简图记录-曾国藩家训 观后感「建议收藏」

    简图记录-曾国藩家训 观后感「建议收藏」简图记录 总结~材料 郦波教授的百家讲坛 和 部分相关书籍  一个人疑惑的时候,总是希望通求知如过阅读找到自己的答案,读史可以使人明智,历史总是有借鉴意义,相对于空谈鸡汤无疑更有说服力。我认为向周围的人学习是个人成长一个非常重要的手段,周围的人都是真实的而且在一定范围是可交流讨论的,相对一些当代的名人 他们的事迹往往都是经过加工 或 胡编 鸡汤意味更浓一些,那么另外一条路就是找一些古代的贤…

    2022年6月4日
    34
  • 用JavaSocket编程开发聊天室,附超详细注释

    用JavaSocket编程开发聊天室,附超详细注释用JavaSocket编程开发聊天室大二下册的JavaWeb课程设计,使用的是eclipse。一、实现功能登录:用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。群聊:可以实现群聊(聊天记录显示在所有客户端界面)。好友列表:完成好友列表在各个客户端上显示。私聊:可以实现私人聊天,用户可以选择某个其他用户,单独发送信息,接受私聊消息方可以直接弹出消息框。踢人:服务器能够群发系统消息,能够强行让某些用户下线。更新:客

    2022年6月16日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号