`
tomotoboy
  • 浏览: 166844 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

进程控制——进程环境

阅读更多
进程环境
进程的环境是一个以 NULL 字符结尾的字符串之集合。在程序中可以用一个以 NULL结尾的字符型指针数组来表示它。系统规定,环境中每个字符串形式如下:
name=somethin

Linux 系统提供了 environ 指针,通过它我们可以在程序中访问其环境内容。在使用 environ 指针前,应该首先声明它:
extern char **environ;

showenv.c
#include <stdio.h>
#include <unistd.h>
extern char** environ;
main()
{
   char** env = environ;
   while(*env){
        printf("%s\n",*env++);
  }
}

下面这个程序的输出为:
TERM=vt100
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=219.221.98.71 3474 22
SSH_TTY=/dev/pts/40
HISTFILESIZE=1000
USER=tomotoboy
MAIL=/var/mail//tomotoboy
PATH=/usr/bin:/usr/local/bin:/usr/local/mysql/bin:/opt/SunStudio_11/SUNWspro/bin
:/usr/ccs/bin:/usr/sfw/bin:.
PWD=/home/l/g/tomotoboy/process
LANG=C
TZ=PRC
PS1=$PWD >
SHLVL=1
HOME=/home/l/g/tomotoboy
LOGNAME=tomotoboy
SSH_CONNECTION=219.221.98.71 3474 192.168.1.10 22
OLDPWD=/home/l/g/tomotoboy
_=./pro_5


如果要为进程指定新的环境,则需要使用 exec 系列中的两种系统调用:execle()和execve()。它们在 Linux 系统函数库 unistd.h中的函数声明如下:
int execle( const char *path, const char *arg , ..., char * const envp[]);
int   execve  ( const  char  *filename,  char   *const argv [], char* const envp[]);
它们的调用方法分别类似于 execl()和 execv(),所不同的是它们增加了一个参数 envp,这是一个以NULL指针结束的字符数组, 它指出了新进程的环境。 下面的程序演示了execve()的用法,它用 execve()把新的环境传送给上面的程序程序showenv:
#include <unistd.h>
main()
{
char *argv[]={"showenv",  NULL},
       *envp[]={"foo=bar",  "bar=foo",  NULL};
execve("./showenv",argv,envp);
perror("exeve failed.");
return;
}


查找系统的指定名称环境变量的值的实现
#include <stdio.h>
#include <unistd.h>
extern char** environ;
//用于查找系统的环境变量的值
char* findenv(char* name)
{
        int len;
        char **p;
        for(p=environ;*p;p++)
        {
                if((len=pcmp(name,*p))>=0 &&*((*p)+len)=='=')
                {
                  char *s=((*p)+len+1);
                  return s;
                }
        }
        return NULL;
}
//比较两个字符串是否相等,不等返回-1,相等返回第一个字符串的长度
int pcmp(char* s1, char* s2)
{
        int i=0;
        while(*s1) {
                i++;
                if (*s1++!=*s2++)
                return -1;
        }
        return i;
}
main(){
      char* name="PATH\0";
      char* s;      
      s=findenv(name);
      printf("%s\n",s);
}
//输出为:
/usr/bin:/usr/local/bin:/usr/local/mysql/bin:/opt/SunStudio_11/SUNWspro/bin:/usr
/ccs/bin:/usr/sfw/bin:.

在 Linux 的系统函数库 stdlib.h 中提供了一个系统调用 getenv(),它完成与findenv()同样的工作。另外还有一个与 getenv()相配对的系统调用 putenv(),它用于改变和扩充环境,其使用方法为:
putenv(“newvariable=value”);
如果调用成功,其就返回零。需要注意的是,它只能改变调用进程的环境,而父进程的环境并不随之改变。
分享到:
评论

相关推荐

    实验一 进程通信——管道和信号实验报告.doc

    【进程控制与互斥】 利用lockf()系统调用来实现进程间的互斥。lockf()可以对文件或文件的一部分进行锁定,防止多个进程同时访问,从而避免数据竞争。在实验中,通过对文件加锁,可以观察到进程执行的顺序和同步现象...

    进程调度————操作系统

    通过本代码示例,我们了解了两种基本的调度策略——FCFS和SJF,并分析了它们的特点和适用场景。对于更复杂的系统,还可能采用其他更为高级的调度算法,如多级反馈队列等。理解这些基础概念有助于更好地设计和优化...

    实验一-进程通信——管道和信号实验报告.doc

    本实验采用Unix系统提供的API进行编程,实现进程控制、进程间通信等功能。主要涉及的系统调用包括但不限于`fork()`、`lockf()`、`signal()`、`kill()`、`pipe()`等。 #### 实验内容详解 1. **进程的创建** - ...

    进程同步——信号量机制

    关于信号量的文章,生产者消费者问题与读者写者问题---信号量机制,PV操作——进程同步的信号量问题,利用信号机制实现的 父子进程同步,嵌入式linux的学习笔记-进程间通信的信号与信号集(四)1)进程的同步与互斥 ...

    获取进程名——vc.txt

    根据提供的文件信息,本文将详细解释如何通过C++编程语言中的Visual C++(VC)环境来获取特定进程的用户名和域名。此知识点主要涉及到Windows API函数的应用,包括进程令牌的操作、用户信息的提取以及SID与用户名...

    进程调度——最高优先级简易模拟系统

    在操作系统设计中,进程调度是核心功能之一,用于...在实际的"进程调度——最高优先级简易模拟系统"项目中,可以结合具体的需求和条件,构建一个模型来演示和分析HPF调度的效果,进一步加深对操作系统调度机制的理解。

    驱动签名 隐藏进程 保护进程 多种方式 保护进程的 驱动

    标题中的“驱动签名”指的是在...综上所述,这些知识点涵盖了驱动程序开发、系统安全、进程控制和保护等方面,是Windows系统编程和安全领域的核心技术。理解并掌握这些概念对于编写安全、可靠的系统级软件至关重要。

    进程管理——操作系统课件

    操作系统之进程管理,阐述了进程状态、进程控制、进程同步以及管程等内容

    进程通信——管道通信

    本文将深入探讨“管道”这种进程通信机制,以及如何在Microsoft Foundation Classes (MFC)环境下实现命名管道通信。 管道通信是早期操作系统中引入的一种简单而有效的进程间通信(IPC, Inter-Process Communication...

    操作系统实验——进程控制.docx

    操作系统实验——进程控制 在操作系统领域,进程控制是核心概念之一,它涉及到程序的执行、内存管理和资源分配。本实验旨在帮助学生理解进程的基本概念,包括进程与程序的区别,以及进程的并发执行、进程控制块...

    阿松进程管家——一款更友好的进程监控防护软件

    这是一款以进程监控为主的进程防护软件,能防木马、杀病毒。与某些貌似高档的垃圾杀毒软件相比,这款软件的最大特点就是进程防护自主性很强...软件并有控制垃圾广告网页窗口的功能, 是上网冲浪花时不可多得的好帮手。

    操作系统实验---进程通信——共享存储区和信号量.doc

    操作系统实验---进程通信——共享存储区和信号量.doc

    操作系统课程设计报告(进程控制与进程通信)

    在现代操作系统设计中,进程控制与进程通信是构建多任务操作系统的核心组件,它们分别负责协调操作系统中各个进程的运行以及进程间的数据交换。本次课程设计通过一个实际案例——实现10000个浮点数求和与平均值的...

    操作系统 进程调度——优先级调度算法

    操作系统实验课程中进程优先级调度算法利用C语言实现程序

    进程监视——Process Monitor V2.02彩虹神话汉化绿色版

    进程监视——Process Monitor V2.02 彩虹神话汉化绿色版 此软件由微软开发,极适合windows上运行 使用也方便,完全绿色,不需安装。

    疯狂内核之——进程管理子系统

    4. **设置新环境**:根据提供的参数设置新进程的执行环境。 5. **启动新程序**:将控制权转移给新程序。 以上就是进程管理子系统中关于进程组织的基础知识点概述。后续章节将进一步探讨中断控制、进程调度以及进程...

    实验一——Linux环境下的进程管理.pdf

    "实验一——Linux环境下的进程管理" 该实验报告主要涉及到 Linux 环境下的进程管理,旨在深入理解进程概念、进程与程序的区别、并发执行的实质、进程争用资源的现象、进程互斥的方法、Linux 系统中进程通信的基本...

    计算机操作系统思维导图第二章进程的描述与控制——西安电子科技大学第四版——免费下载

    进程控制块(PCB)是操作系统中用于记录进程状态和环境信息的重要数据结构。它包括进程标识符、程序计数器、寄存器集合、内存管理信息、会计信息、I/O状态信息等。PCB是进程存在的唯一标志,操作系统通过PCB来实现对...

    【Android 进程保活】应用进程拉活 ( 双进程守护保活 ) 修改.zip

    【Android 进程保活】应用进程拉活 ( 双进程守护保活 ) https://hanshuliang.blog.csdn.net/article/details/115604667 博客源码快照

Global site tag (gtag.js) - Google Analytics