调用execve()+改变PWD

uet 发布于 2019-03-09 c++ 最后更新 2019-03-09 14:37 2 浏览

我想写一个程序A,它执行另一个程序B。 从其目录执行程序B非常重要,因为它启动位于B的同一目录中的程序BB。 我的意思是: ./B会起作用 ./b/B不起作用 我想过两种方法:

  1. 执行fork(),在env中更改PWD,然后调用execv()
  2. 执行fork(),创建时间变量envp,然后调用execve()
可以说节目A位于此处:/home/a,节目BBB位于此处:/home/a/b 这是我/home/a中的程序A的代码
#include <iostream>
#include <errno.h>
int main() {
int pid;
    char *cmd[20] = {"/home/a/b/B", NULL};
if ((pid = fork()) == 0) {
/*if (putenv("PWD=/home/a/b") < 0) {
            fprintf(stderr, "error PWD%s\n", strerror(errno));
        }*/
char *envp[20] = {"PWD=/home/a/b", NULL};
execve( cmd[0], cmd, envp);
fprintf(stderr, "error: execv: %s\n", strerror(errno));
        exit(0);
    } else if (pid < 0) {
        fprintf(stderr, "error: fork: %s\n", strerror(errno));
        exit(0);
        }
fprintf(stderr, "father quits\n");
返回0; } 我尝试了两种解决方案,但都没有工作, 我的意思是,我设法执行程序B,但它找不到程序BB。 我还打印了程序的B的PWD,它是/home/a/b/ - 但仍然无法执行BB。 可能吗? 有人能看到我是我做错了吗? 谢谢
已邀请:

zfugit

赞同来自:

您正在寻找chdir()而不是envp操纵。