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")
影响服务器性能的四大杀手
数据拷贝
环境切换
内存分配
锁竞争
无锁队列