Process
常用命令总结
1.ps -eLo pid,tid,%cpu,%mem,psr,comm
2.cpu load 1S 打印一次: mpstat -P ALL 1
3.nice -n -20 ./xxx.elf
4.git diff > xxx.patch
5.git diff --name-only
git diff HEAD file1 > file1.patch file1文件包含所在的路径
git diff HEAD file2 > file2.patch
ps
`ps`命令提供了许多选项和格式化输出标志,以满足不同需求。以下是一些常用的`ps`选项和格式化输出标志:
1. **常用`ps`选项**:
- `-e`: 显示系统中所有进程。
- `-f`: 显示详细的进程信息,包括父进程、终端、CPU使用率等。
- `-l`: 显示更详细的进程信息,包括进程状态、优先级、虚拟内存大小等。
- `-aux`: 显示所有进程的详细信息,包括用户、CPU使用率等。
- `-A`: 显示所有进程,包括守护进程(daemon)。
- `-t`: 显示与指定终端关联的进程。
1. **格式化输出标志**:
- `pid`: 进程ID。
- `ppid`: 父进程ID。
- `uid`: 用户ID。
- `gid`: 用户组ID。
- `tty`: 终端。
- `ni`: 进程的nice值。
- `sz`: 进程使用的虚拟内存大小。
- `vsz`: 进程使用的虚拟内存大小(以K为单位)。
- `rss`: 进程使用的物理内存大小。
- `%cpu`: CPU利用率。
- `%mem`: 内存利用率。
- `comm`: 进程名称。
1. **其他常用选项**:
- `-o`: 允许用户自定义输出格式,可以选择要显示的字段。
- `-C`: 仅列出指定命令名的进程。
- `-u`: 列出指定用户的进程。
- `-k`: 列出指定进程组的进程。
- `-r`: 列出正在运行的进程。
这些选项和输出标志可以组合使用,以便获取所需的信息。要了解更多选项和输出格式,你可以查阅`ps`命令的手册页,使用`man ps`命令或者`ps --help`查看可用选项。
常用命令: ps -eLo pid,tid,%cpu,%mem,psr,comm
cpu load 1S 打印一次: mpstat -P ALL 1
linux动态库测试程序
step
在编译动态库时,您需要使用`-shared`选项来告诉编译器生成共享库,同时使用`-fPIC`选项确保生成位置无关的代码。下面是一个简单的示例:
1
2
gcc -o sum.o -c -fPIC sum.c
gcc -o libsum.so -shared sum.o
这里假设您的源文件名为`sum.c`。第一行将`sum.c`编译成一个位置无关的目标文件`sum.o`,而第二行将其链接成共享库`libsum.so`。
如果您要指定链接时的库的名称,可以使用`-o`选项。例如:
1
gcc -o libmylibrary.so -shared sum.o
这将生成名为`libmylibrary.so`的共享库。
如果您的动态库依赖于其他库,您可能需要通过`-l`和`-L`选项来指定链接库的名称和库的路径。例如,如果您的动态库依赖于`libm`,则可以这样编译:
1
gcc -o libsum.so -shared sum.o -lm
这里的`-lm`表示链接数学库。
最终,如果您的测试程序也在一个单独的文件中,您可以使用以下命令来编译它:
1
gcc -o test_sum test_sum.c -ldl -lsum -L.
这里,`-lsum`表示链接`libsum.so`,而`-L.`表示在当前目录中查找库。请确保在运行测试程序之前,系统能够找到动态库,可以通过设置`LD_LIBRARY_PATH`环境变量或将动态库放在系统库路径下来实现。
example
libSum.so
‘’’C
#include <stdio.h>
extern “C”
{
int Sum(int a,int b)
{
printf(“Input a = %d,b= %d\n”,a,b);
return a+b;
}
}
//Visual Studio 2022 打开 C++ linux创建控制台工程,然后选择生成so动态库,连接远程linux,生成不同平台的.so
‘’’
main.c:
‘’’C
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>
extern int Sum(int a,int b);
int main(void)
{
printf(“Result of Sum3,4() : %d\n”,Sum(3,4));
return 0;
}
‘’’
编译main.c sudo cp libSum.so /usr/lib
gcc -o main main.c -ldl -lSum -L.
配置实时进程的方法
‘’’C
/* 在Linux系统中,可以通过以下步骤将一个进程配置为实时进程:
在编译程序时,添加实时标志:-pthread -lrt
在程序代码中使用实时调度策略:
cpp
Copy code
#include <sched.h>
// 在主线程中
struct sched_param param;
param.sched_priority = sched_get_priority_max(SCHED_FIFO);
sched_setscheduler(0, SCHED_FIFO, ¶m);
这会将主线程设置为FIFO实时调度。
在程序启动前,使用chrt命令将其优先级设为最大:
Copy code
chrt -f -p 99 ./your_program
将程序进程锁定到特定CPU核:
Copy code
taskset 0x1 ./your_program
这会锁定到核1上。
调整实时调度器参数:
在/etc/security/limits.conf中加入:
Copy code
@users - rtprio 99
禁用地址空间随机化:
Copy code
echo 0 > /proc/sys/kernel/randomize_va_space
通过以上步骤,就可以获得较高的实时性能。当然,还需要避免在程序中有长时间的阻塞和等待。
Copy
chrt -f -p 99 ./your_program 和nice -n -20 ./your_program 是一样的效果吗 如果不是有什么区别呢
PZ
chrt 和 nice 这两个命令都可以影响 Linux 进程的调度优先级,但有一些区别:
chrt 用于设置实时优先级,nice 用于设置普通优先级
chrt 可以将进程优先级设置为 1-99 的实时范围,会使用实时调度策略如 SCHED_FIFO。nice 的范围是 -20 到 19,使用普通的调度策略。
chrt 优先级更高
chrt 设置的 1-99 优先级高于 nice 设置的 -20 到 19 优先级。实时进程总会抢占普通进程。
chrt 效果暂时,nice 效果持久
chrt 设置只对当前shell有效,进程结束后优先级失效。nice 设置会持久保存到进程结束。
chrt 能绑核,nice 不能
chrt 可以通过 -a 参数将进程绑定到某个 CPU 核上,nice 不提供这个功能。
所以 chrt -f -p 99 和 nice -n -20 效果上不是完全一致的:
chrt 会启用实时调度,且优先级范围高于 nice。
chrt 的优先级设置不会持久化,nice 会持久化。
chrt 可以绑核,nice 不可以。
需要根据实际场景选择使用最合适的命令来设置优先级 */
‘’’
patch generate methods
‘’’C
为每一个被修改的文件分别生成对应的patch文件,而不是把所有修改放在一个patch里。
可以通过以下方法实现:
利用git diff的--name-only选项先查看这次修改了哪些文件:
Copy code
git diff --name-only
这会输出所有的被修改的文件名。
然后对每个文件分别进行diff,重定向到各自的patch文件:
Copy code
git diff HEAD file1 > file1.patch
git diff HEAD file2 > file2.patch
重复这个过程,直到所有被修改的文件都有了对应的patch文件。
最后可以用git apply分别应用这些patch来还原一部分的修改。
这样就可以非常方便地将一次修改分解为对各个文件分别的patch文件。
这种方式在需要分别提交修改的不同部分到代码库时非常有用。
‘’’
linux use tips
- cat /proc/cmdline 可以查看系统的启动参数
- console=ttyLF0,115200 root=/dev/mmcblk0p2 rootwait rw earlycon
- 也可以通过 dmesg | grep “Kernel command line”
- 可以在uboot命令行中printenv bootargs打印当前的变量内容
- 内容如下 bootargs=root=/dev/ram rw earlycon loglevel=7
- setenv bootargs “root=/dev/ram rw earlycon loglevel=7 printk.time=y initcall_debug” 然后 saveenv 接着reset
- 修改 Kernel 的 Bootargs:添加 printk.time=y initcall_debug 到 bootargs 中,以便查看每个模块的启动耗时