免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: satan212
打印 上一主题 下一主题

[函数] 不用env,用函数怎样修改进程的环境列表(置空,添加,删除) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-02-11 18:12 |只看该作者
原帖由 FH 于 2006-1-26 00:41 发表
进程的环境变量是不能改的


不对吧?为什么不用setenv()?

论坛徽章:
0
12 [报告]
发表于 2006-02-11 21:35 |只看该作者
自己填充 env vars,然后 exec 一下自身……

论坛徽章:
0
13 [报告]
发表于 2006-02-11 22:51 |只看该作者
原帖由 wolf0403 于 2006-2-11 21:35 发表
自己填充 env vars,然后 exec 一下自身……


俺来描述一下这段代码

  1. if (strcmp(getenv("TestEnv"), "ExpectedValue") != 0) {
  2.     setenv("TestEnv", "ExpectedValue");
  3.     exec(argv[0]);
  4. }
  5. else {
  6.     do_something();
  7. }
复制代码


好像程序自己在骗自己玩

论坛徽章:
0
14 [报告]
发表于 2006-02-11 22:52 |只看该作者
没有看懂,但是修改环境变量不是应该很简单吗 ?
那些函数最后还是要修改environ指针的吗?

论坛徽章:
0
15 [报告]
发表于 2006-02-13 14:44 |只看该作者
/*
*        env [ - ] [ name=value ]... [command arg...]
*        set environment, then execute command (or print environment)
*        - says start fresh, otherwise merge with inherited environment
*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <limits.h>
#include <ctype.h>
#include <locale.h>
#include <string.h>
#include <unistd.h>


static        void        Usage();
static        char        *nullp = NULL;
extern        char        **environ;


int
main(int argc, char **argv)
{
        char        **p;
        int        opt;
        int        i;


        (void) setlocale(LC_ALL, "");

#if        !defined(TEXT_DOMAIN)        /* Should be defined by cc -D */
#define        TEXT_DOMAIN "SYS_TEST"        /* Use this only if it weren't */
#endif
        (void) textdomain(TEXT_DOMAIN);

        /* check for non-standard "-" option */
        if ((argc > 1) && (strcmp(argv[1], "-")) == 0) {
                environ = &nullp;
                for (i = 1; i < argc; i++)
                        argv[i] = argv[i+1];
                argc--;
        }

        /* get options */
        while ((opt = getopt(argc, argv, "i")) != EOF) {
                switch (opt) {
                case 'i':
                        environ = &nullp;
                        break;

                default:
                        Usage();
                }
        }

        /* get environment strings */
        while (argv[optind] != NULL && strchr(argv[optind], '=') != NULL) {
                if (putenv(argv[optind])) {
                        (void) perror(argv[optind]);
                        exit(1);
                }
                optind++;
        }

        /* if no utility, output environment strings */
        if (argv[optind] == NULL) {
                p = environ;
                while (*p != NULL)
                        (void) puts(*p++);
        } else {
                (void) execvp(argv[optind],  &argv[optind]);
                (void) perror(argv[0]);
                exit(((errno == ENOENT) || (errno == ENOTDIR)) ? 127 : 126);
        }
        return (0);
}


static        void
Usage()
{
        (void) fprintf(stderr, gettext(
            "Usage: env [-i] [name=value ...] [utility [argument ...]]\n"
            "       env [-] [name=value ...] [utility [argument ...]]\n"));
        exit(1);
}

论坛徽章:
0
16 [报告]
发表于 2006-02-13 18:05 |只看该作者
找到变量指针 直接更改 ,, 呵呵 估计系统不让你改

论坛徽章:
0
17 [报告]
发表于 2006-02-13 18:43 |只看该作者
如果是修改当前shell的环境变量,估计只能使用shell本身提供的内置命令。

原帖由 satan212 于 2006-1-25 15:18 发表
不用env,用函数怎样修改进程的环境列表(置空,添加,删除)

想做个env工具,有什么资料可以参考,有哪些注意的东西?

请高人指点

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP