• 我爱抄代码进程


    一、展示进程的环境变量列表

    /* display_env.c
    
       展示进程的环境变量列表.
    */
    #include "tlpi_hdr.h"
    
    extern char **environ;
                    /* Or define _GNU_SOURCE to get it from <unistd.h> */
    
    int
    main(int argc, char *argv[])
    {
        char **ep;
    
        for (ep = environ; *ep != NULL; ep++)
            puts(*ep);
    
        exit(EXIT_SUCCESS);
    }

    二、执行时修改环境变量

    执行案例:

    ./modify_env"GREET=Hello" SHELL=/bin/bash BYE=ciao

    输出:
    GREET=Hello
    SHELL=/bin/bash
    执行案例:
     ./modify_env SHELL=/bin/bash BYE=byebye

    输出:
    SHELL=/bin/bash
    GREET=Hello world

    modify_env.c

    /* modify_env.c
       本文件中的代码只能在linux环境执行
    */
    #define _GNU_SOURCE     /* Get various declarations from <stdlib.h> */
    #include <stdlib.h>
    #include "tlpi_hdr.h"
    
    extern char **environ;
    
    int
    main(int argc, char *argv[])
    {
        int j;
        char **ep;
    
        clearenv();         /* 清空所有环境变量 */
    
        /* 将命令行参数的变量加入env */
    
        for (j = 1; j < argc; j++)
            if (putenv(argv[j]) != 0)
                errExit("putenv: %s", argv[j]);
    
        /* 如果GREET对应的env变量不存在,则赋值为hello world */
    
        if (setenv("GREET", "Hello world", 0) == -1)
            errExit("setenv");
    
        /* 删除BYE对应的env */
    
        unsetenv("BYE");
    
        /* Display current environment */
    
        for (ep = environ; *ep != NULL; ep++)
            puts(*ep);
    
        exit(EXIT_SUCCESS);
    }

    三、跨函数跳转

    goto可以在函数内跳转,下面的代码可以跨函数跳转

    /* longjmp.c
       展示通过 setjmp()和longjmp()实现跨越函数的跳转.
       属于奇淫巧技的范畴,尽量不要使用
       使用案例:  longjmp
                longjmp x
                longjmp x y
    */
    #include <setjmp.h>
    #include "tlpi_hdr.h"
    
    //setjmp、longjmp必须使用同一env,所以设为全局变量
    static jmp_buf env;
    
    static void f3(void) {
        longjmp(env, 3);
    }
    
    static void f2(void) {
        longjmp(env, 2);
    }
    
    static void f1(int argc) {
        if (argc == 1)
            longjmp(env, 1);
        if (argc == 2)
            f2();
        if (argc == 3) {
            f3();
        }
    }
    
    int
    main(int argc, char *argv[]) {
        //setjmp()调用为后续的longjmp()调用执行的跳转确立了跳转目标,该目标正是程序发起setjmp()调用的位置
        switch (setjmp(env)) {
            case 0:     /* setjmp第一次执行返回0,第二次执行时返回由longjmp设置的val值 */
                printf("Calling f1() after initial setjmp()\n");
                f1(argc);               /* Never returns... */
                break;                  /* ... but this is good form */
    
            case 1:
                printf("We jumped back from f1()\n");
                break;
            case 2:
                printf("We jumped back from f2()\n");
                break;
            case 3:
                printf("We jumped back from f3()\n");
                break;
        }
    
        exit(EXIT_SUCCESS);
    }
  • 相关阅读:
    laravel常用函数大全Helper
    laravel查询语句指定索引(mysql强制索引)
    laravel-admin后台系统开发
    ES搜索引擎详解
    怎么查看当前的git分支是基于哪个分支创建的
    laravel中使用offsetSet
    laragon安装新的php版本
    Laravel collect妙用
    composer install file could not be downloaded (HTTP/1.1 405 Not Allowed)
    garphql
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/16165235.html
Copyright © 2020-2023  润新知