【Linux】进程优先级与环境变量

版权声明:本文为博主原创文章,未经博主允许不得转载。Copyright (c) 2018, code farmer from sust. All rights reserved. https://blog.csdn.net/sustzc/article/details/82734202

ps -l  ps -elf
    PRI表示优先级别  优先级别数字越小,优先级别越高
    NI表示优先级的修正值(nice值)  进程的nice值并不是进程的优先级,但nice值会影响进程的优先级。
        PRI(new) = PRI(old) + nice
        
        nice的取值范围是[-20, 19]  共40个级别
    
        修改NI的值可以改变进程的执行顺序。
        启动进程前调整 nice
            nice -n -5 ./test
        调整已存在进程的nice
            使用renice指令  renice -5 -p 5200      (ps:5200表示的是PID)
    
top
    出现命令行后,
    h 帮助  q  退出  r表示renice
    shift+>向下翻屏  shift+<向上翻屏
    默认按照CPU的占用率从高到低排序
    按下shift + m后按照RES从高到低排序
    按下k表示kill  输入pid再按回车即可杀死该进程
    
    更改已存在进程的nice
        进入top后按下'r'->输入PID->输入nice值
        
    相当于Windows下的任务管理器
    
    占用内存
        VIRT 虚拟内存
        RES    物理内存
    
pstree打印进程树    
pstree | grep -A2 -B2 "bash"
-A  after
-B  before

按下bash可以开启一个进程

本地变量:只能在当前进程使用
环境变量:在当前进程及其子进程中均可使用
子进程创建的环境变量 其父进程是用不了的。

将本地变量变为环境变量
export name=val ( 注意:= 左右不能有空格)
env 获取全部环境变量
echo $环境变量名  打印出对应的环境变量值

unset avj
删除(取消设置)变量(本地变量或者环境变量)
添加.   $PATH表示之前所有的PATH,然后用:隔开
PATH=$PATH:.

    设置用户特殊的环境变量
    vim ~/.bash_profile
    vim ~/.bashrc
    当前终端设置的环境变量只能在当前终端使用,离开就没有了
如果想所有的地方都能使用环境变量需要配置在 ~/.bash_profile,    如果希望在配置文件中设置的变量生效,要重启。

Ubuntu 设置自启动环境变量
切换到root用户,vim /etc/profile  
添加 echo "/etc/profile"
export PATH=$PATH:.

接着vim /etc/bash.bashrc
添加 echo "/etc/bash.bashrc"

在/etc目录下执行source profile  接着执行source bash.bashrc
重启终端即可生效。

char * argc[]
第一个参数是命令 最后一个参数是NULL

实现env命令源码

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 int main(int argc, char * argv[], char * envp[])
  5 {
  6     int i = 0;
  7     while (NULL != envp[i])
  8     {
  9         printf("%s\n", envp[i]);
 10         i++;
 11     }
 12 }

若想要获取环境变量,那么只需要命令行参数越界后,就可以获取环境变量,并且也可以对其进行修改。

nm ./main
nm ./test
查看进程的地址

在程序中获取环境变量
    1. 获取所有的环境变量, main的第三个参数
    2. 获取某一个环境变量 : val = getenv("name");
    #include <stdlib.h>
    char * val = getenv("SHELL");     char *getenv(const char *name);
在程序中设置环境变量:
    putenv("name=value");   char *putenv(const char *name);

错误处理:
    Linux 绝大部分函数出错返回值都是 -1
    int errno; // Linux中的函数出错以后,将错误编号放在errno全局变量中
    
    errno带回的错误编号 与 错误编号对应的错误信息描述构成了一张表格(或者说一个数组),
    实际上,打印错误信息是在打印errno所带回的错误编号对应的错误内容。
    
    if (fork() == -1)
        printf("%d\n", errno);
    char *strerror(errno); // 通过错误编号,返回错误信息
    
    #include <errno.h>
    #include <string.h>
    printf("fork: %s", strerror(errno)); // 工作中建议使用这种方式来打印错误信息

    perror("fork");
        |等|
        |价|
    cmd = "fork";
    printf("%s:%s\n", cmd, strerror(errno));
    
vfork:
    int vfork(void);
    vfork也可以用于创建一个子进程,但是子进程和父进程共用一块虚拟地址空间,栈也是共用的,
    而fork创建的子进程具有独立的地址空间。
    
    vfork保证子进程先运行,在它调用exec或者exit之后父进程才可能被调度运行。
    即使fork实现了写时拷贝,也没有vfork高效,但是尽量不要用vfork,因为在任何一个系统上实现的vfork都有问题。
    
    vfork不写时拷贝
    退出时要用exit(0)
    _exit
    调用exec
    
写时拷贝:
    mm_struct 管理虚拟内存空间
    通过打印子进程和父进程的地址可以发现,地址都是一样的,实际上打印的是虚拟内存地址。
    物理内存地址不同的,因为父子进程在物理内存中映射的不一样。
    准备工作
        栈的权限 rw-
        数据权限 rw-
        代码权限 r-x
    拷贝前  将写的权限去掉
        栈的权限 r--
        数据权限 r--
        代码权限 r-x
    拷贝时   子进程之前是复制父进程的相关数据以及内存指针等,这时候需要修改数据的话,
    会先在物理内存中复制数据到空闲空间,然后赋予写的权限后就可以修改数据了。
        栈的权限 rw-
        数据权限 rw-
        代码权限 r-x

    find /usr/src/ -name "*.h" | xargs grep -n struct task_struct {}
    
修改中文编码为UTF-8
    1.  环境变量LANG="zh_CN.UTF-8"
    2.  在/etc/sysconfig/i18n  下面添加LANG="zh_CN.UTF-8"

cd ~用户: 直接返回到该用户的家目录(必须保证该用户存在)
    
内核:
    宏内核 windows是一个整体模块
    微内核 可以裁剪不用的模块,因为linux是一个模块一个模块的.
        比如图形界面模块、命令模块
    
将路径配置到环境变量中
    export WWWROOT=/www
    getenv("WWWROOT")

影响服务器性能的四大杀手
    数据拷贝
    环境切换
    内存分配
    锁竞争
        无锁队列

猜你喜欢

转载自blog.csdn.net/sustzc/article/details/82734202