我一直在努力理解execve命令,我遇到了一个问题,我已经缩小了范围.我感到困惑的是,为什么execve不能与"哪个"命令一起工作,而与其他命令(如"ls")一起工作得很好.我直接从Bashshell 获得了这些可执行文件的路径.

以下是不适用于"Which"的代码:

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

int main(void)
{
    char    *cmd_args_joined[] = {"which", "ls", NULL};
    char    cmd_plus_path[] = "/usr/bin/which";

    if (execve(cmd_plus_path, cmd_args_joined, NULL) < 0)
    {
        perror("failed at execve\n");
        exit(1);
    }
    return (0);
}

下面是与"ls"一起工作的代码:

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

int main(void)
{
    char    *cmd_args_joined[] = {"ls", NULL};
    char    cmd_plus_path[] = "/bin/ls";

    if (execve(cmd_plus_path, cmd_args_joined, NULL) < 0)
    {
        perror("failed at execve\n");
        exit(1);
    }
    return (0);
}

我非常感谢任何能帮助我理解和解决这个问题的见解或建议.谢谢!

我最初怀疑我可能无意中将标准输出重定向到了另一个文件.然而,鉴于上面的代码没有使用dup2()进行重定向,我必须得出结论,我最初的假设是不正确的.

推荐答案

问题不在于你要不要go 执行.问题是没有环境,which找不到ls,也不会产生任何输出.如果您判断了返回代码,您会发现它不是零.

愚蠢的解决办法:

if (execve(cmd_plus_path, cmd_args_joined, environ) < 0)

导出的变量environ是工艺环境.您也可以将其捕获为main的第三个参数,但这已被弃用.

C++相关问答推荐

字符串令牌化xpath表达式

堆栈帧和值指针

为什么内核使用扩展到前后相同的宏定义?

带有sigLongjMP中断I/O的异常处理程序

C语言编译阶段与翻译阶段的关系

如何使用[BTStack]BLE发送大型(>;2kb)信息包

进程在写入管道时挂起

为什么将函数名括在括号中会禁用隐式声明?

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

仅从限制指针参数声明推断非混叠

通过k&;r语法的c声明无效

如何修复我的qsort()算法?它每次都给出不同的结果

Linux/C:带有子进程的进程在添加waitid后都挂起

RISC-V GCC编译器错误编译ASM代码

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

将数组返回到链表

创建 makefile 来编译位于不同目录中的多个源文件

窗口消息处理函数以某种方式更改了应保持不变的 int 变量的值