进程环境
进程的属性
一个进程包含了一些必要的属性:
属性 | 作用 |
ID | 在操作系统中唯一代表了进程的身份 |
实际用户 ID 和实际组 ID | 执行进程的用户的身份标示 |
有效用户 ID 和有效组 ID | 进程执行时权限和有效用户相等 |
当前工作目录 | 代表了进程解析相对路径的起点 |
环境变量列表 | 代表了进程的环境变量 |
一般而言,有效 ID 和实际 ID 相等,但是当使用 sudo 执行程序后,程序的实际 ID 就被设置为了 0,使其具备等同 root 用户的资源访问权
例如,如果我们需要查看当前进程时候以 root 权限执行:
if os.Geteuid() != 0 {
logrus.Fatalln("请使用超级用户运行此程序")
}
替代软件
下面的软件可用于替代 malloc:
库 | 特点 |
libmalloc | 可以细化内存分配细节、并使用 mallinfo 查看已经分配的空间 |
vmalloc | 可以对不同的储存区使用不同的技术 |
quick-fit | 顾名思义 |
jemalloc | malloc 在 FreeBSD 中的实现。具有良好的拓展性 |
TCMalloc | Google 开源的工具 |
alloca | 在栈帧上分配空间 |
对于 libc 也有一些不同的实现:
库 | 特点 |
glibc | 大而全,效率高 |
musl | 代码更简洁 |
eglibc | 专注于优化空间 |
环境变量
环境变量的读写可以由以下函数完成:
#include <stdlib.h>
char *getenv(const char *name);
char *secure_getenv(const char *name);
int putenv(char *string);
int setenv(const char *name, const char *value, int overwrite);
int unsetenv(const char *name);
不要使用 putenv 函数,因为它使用的是浅拷贝 |
对运行时的进程设置 LD_LIBRARY_PATH 变量无效,因为 LD_LIBRARY_PATH 是由动态链接加载程序(ld.so)处理的,这些工作是在程序启动时完成的。
但是运行时的进程设置 LD_LIBRARY_PATH 可以影响子进程的链接过程。
在使用多进程编程中,fork 之后,exec 之前的所有环境变量(包括 LD_LIBRARY_PATH)都会影响子进程
获取 root 权限
uid_t uid = getuid();
if(setuid(0)){ // 请求 root 权限
return -1;
}
if(setuid(uid)){ // 恢复 uid
// ...
}