进程环境

进程的属性

一个进程包含了一些必要的属性:

属性

作用

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
    // ...
}
Last moify: 2023-03-03 05:08:33
Build time:2025-07-18 09:41:42
Powered By asphinx