首页 > 系统相关 >[Linux环境变成]Linux设置子进程环境变量

[Linux环境变成]Linux设置子进程环境变量

时间:2023-03-12 20:32:23浏览次数:48  
标签:const pid char posix file Linux 进程 include 环境变量

posix_spawn通过一个指定的可执行文件创建子进程,并设置其启动参数和环境变量。其原型如下:

#include <spawn.h>

// pid:子进程的进程号
// path:创建子进程的可执行文件路径
// file_actions:与文件相关的操作
// attrp:进程属性
// argv:子进程的启动参数
// envp:子进程的环境变量
int posix_spawn(pid_t *pid, const char *path,
                       const posix_spawn_file_actions_t *file_actions,
                       const posix_spawnattr_t *attrp,
                       char *const argv[], char *const envp[]);

int posix_spawnp(pid_t *pid, const char *file,
                       const posix_spawn_file_actions_t *file_actions,
                       const posix_spawnattr_t *attrp,
                       char *const argv[], char *const envp[]);

例子

我们在main.cc中创建一个子进程,并且通过posix_spawn为子进程设置进程的启动参数、环境变量,然后在子进程输出相关信息,代码和makefile分别如下:

main.cc

// main.cc
#include <unistd.h>
#include <stdio.h>
#include <iostream>
#include <spawn.h>


int main(int argc,char *argv[])
{
    char *file = "/home/lighthouse/workspace/linux-action/02-posix-spawn-envp/child_process";
    pid_t pid;
    char *envp[] = {
        "PATH=/usr/sbin",
        "WORKSPACE=/workspace",
        "UMASK=007",
        nullptr
    };

    char *_argv[] = {
        "ttl",
        "500",
        "delay",
        "999",
        nullptr
    };
    int ret = posix_spawn(&pid,file,nullptr,nullptr,_argv,envp);

    if (ret != 0)
    {
        std::cout << "spawn failed,file:" << file << ",code:" << ret << std::endl;
    }

    pause();   
    return 0;// this is comment
}

child_process.cc

#include <stdio.h>
#include <iostream>
#include <unistd.h>

extern char **environ;


int main(int argc,char *argv[])
{
    char **env = environ;
    if (environ == nullptr)
    {
        std::cout << "nullptr envp" << std::endl;
    }

    while (*env != nullptr)
    {
        std::cout << *env << std::endl;
        env++;
    }

    std::cout << "arg count:" << argc << std::endl;
    for (int i = 0;i < argc;++i)
    {
        std::cout << argv[i] << " ";
    }
    std::cout << std::endl;
    pause();
    return 0;// this is comment
}

Makefile

C = gcc
CXX = g++
SOURCE_C = 
OBJECTS_C = 
SOURCE_CXX = child_process.cc
TARGET = child_process
LDFLAGS_COMMON = -std=c++2a


MAIN_CXX = main.cc
MAIN_TARGET = main

all:
	$(CXX) $(SOURCE_CXX)  $(LDFLAGS_COMMON) -o $(TARGET)
	$(CXX) $(MAIN_CXX)  $(LDFLAGS_COMMON) -o $(MAIN_TARGET)
clean:
	rm -rf *.o $(TARGET) ${MAIN_TARGET}

标签:const,pid,char,posix,file,Linux,进程,include,环境变量
From: https://blog.51cto.com/u_6650004/6116259

相关文章

  • Linux用户以及ssh安全相关设置
    Linux用户相关操作摘要最近重保,需要进行网络安全防护.部分同事处理过程总是顺序有一些不太对的情况.同时发现自对Linux用户设置也存在很多不清不楚的地方所以趁着......
  • 在Linux中如何注销其他 SSH 用户
    如果你通过ssh登录了一个远程Linux系统,只需要使用exit 命令即可退出ssh。那么,如果你想要注销其他通过ssh登录到系统中的用户呢?在ssh会话中注销用户首先,检查L......
  • init 和 systemd:Linux守护进程
    现代Linux都采用systemd来作为守护进程,例如在Ubuntu18.04上它们都指向同一个systemd,$ll/sbin/init/sbin/init->/lib/systemd/systemd*$ll/bin/systemd/......
  • Linux基础之less命令实战
    1less命令的介绍less命令的功能是用于分页显示文件内容。分页显示的功能与more命令很相像。但more命令只能从前向后浏览文件内容,而less命令则不仅能从前向后(PageDown键),还可......
  • linux下的ptrace函数
    Linux下的ptrace函数ptrace系统调用的用途ptrace系统调从名字上看是用于进程跟踪的,它提供了父进程可以观察和控制其子进程执行的能力,并允许父进程检查和替换子进程的内核......
  • Linux 嵌入式预备知识
    硬件启动 从EMMC启动10100110  1.bootmode01参考手册/芯片手册2.bootdevices  只有内部启动[1:0]的时候才会需要选择启动设备  支持NORflash,NANDfl......
  • Linux pkill 命令
    原文地址:https://www.runoob.com/linux/linux-comm-pkill.htmlLinuxpkill用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程,类似于 killall 命令。kill......
  • Linux操作系统CentOS 7忘记root密码解决办法
    root用户忘记密码解决办法重启系统输入命令:reboot,并在重启的前三秒内按向下的按键,目的是为为了不让它进入系统,而是停留在开机页面,如下图所示编辑文档在开机页面按方向......
  • linux中cp-a和cp-r的区别是什么
    原文地址:http://net.sanhaostreet.com/it/202203/1513250.htmllinux中cp-a和cp-r的区别是什么Linuxcp(英文全拼:copyfile)命令主要用于复制文件或目录。语法cp[options......
  • 在Linux中如何注销其他 SSH 用户
    今天我们简单介绍一下如何踢掉其他通过ssh连接到系统中的用户。 Pixelatedword Linux madefromcubes,mosaicpattern如果你通过ssh登录了一个远程L......