(done) 关于 GNU/Linux API setenv 的实验

写一个下面的代码来验证

c 复制代码
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() {
    // 设置环境变量 MY_VAR 的值为 "hello_world"
    if (setenv("MY_VAR", "hello_world", 1) != 0) {
        perror("setenv");
        return 1;
    }

    pid_t pid;

    // 使用 fork() 创建一个新进程
    pid = fork();

    if (pid < 0) {
        // 错误处理:fork() 返回负值表示创建子进程失败
        fprintf(stderr, "Fork failed\n");
        return 1;
    } else if (pid == 0) {
        // 在子进程中执行的代码
        printf("Child process: Hello, I am the child process! PID: %d\n", getpid());
        // 获取并打印设置的环境变量 MY_VAR 的值
        char *value = getenv("MY_VAR");
        if (value != NULL) {
            printf("in child, MY_VAR is set to: %s\n", value);
        } else {
            printf("MY_VAR is not set.\n");
        }

        pid_t pid;
        // 使用 fork() 创建一个新进程
        pid = fork();
        if (pid == 0) {
                char *value = getenv("MY_VAR");
                if (value != NULL) {
                    printf("in grandchild, MY_VAR is set to: %s\n", value);
                } else {
                    printf("MY_VAR is not set.\n");
                }
        }

    } else {
        // 在父进程中执行的代码
        printf("Parent process: Hello, I am the parent process! PID: %d\n", getpid());
        printf("Parent process: Child's PID: %d\n", pid);
    }

    // 父子进程都会执行的代码
    printf("Hello from process PID: %d\n", getpid());

    return 0;
}

编译并执行后,执行结果如下:

复制代码
Parent process: Hello, I am the parent process! PID: 923571
Parent process: Child's PID: 923572
Hello from process PID: 923571
Child process: Hello, I am the child process! PID: 923572
in child, MY_VAR is set to: hello_world
Hello from process PID: 923572
in grandchild, MY_VAR is set to: hello_world
Hello from process PID: 923573

可以看到环境变量 MY_VAR 被传递给了儿子和孙子

此时我们在 terminal echo $MY_VAR 试试

可以看到 MY_VAR 为空。也就是说,setenv 所设置的变量的 Lifecycle 仅限于程序还活着的时候

相关推荐
qinyia35 分钟前
Wisdom SSH 是一款创新性工具,通过集成 AI 助手,为服务器性能优化带来极大便利。
服务器·人工智能·ssh
MilesShi2 小时前
从 scheduler_tick 到上下文切换:深入解析 Linux 内核的 TIF_NEED_RESCHED 标志设置流程
linux·运维·单片机
晓衣5 小时前
2025“獬豸杯”全国电子数据取证竞赛-k8s服务器取证wp
服务器·经验分享·程序人生·网络安全·容器·kubernetes·学习方法
我爱云计算5 小时前
K8S详解(5万字详细教程)
linux·运维·云原生·容器·kubernetes
2301_794333917 小时前
实验室服务器配置|通过Docker实现Linux系统多用户隔离与安全防控
linux·服务器·docker·实验室
荣光波比8 小时前
Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装
linux·运维·服务器·nginx·云计算
武文斌778 小时前
单片机:DS18B20测温度、74HC595扩展芯片、8*8LED矩阵
运维·服务器·单片机·嵌入式硬件
阿sir1989 小时前
ZYNQ 自定义IP
服务器·网络·tcp/ip
绿箭柠檬茶10 小时前
Ubuntu 使用 Samba 共享文件夹
linux·运维·ubuntu
工藤新一¹11 小时前
Linux —— 虚拟进程地址空间
linux·运维·服务器·c/c++·虚拟进程地址空间