【问题标题】:Compiler bug cause execve to fail?编译器错误导致 execve 失败?
【发布时间】:2016-01-14 01:30:36
【问题描述】:

我遇到了一个神秘的 C 程序,它在我的电脑上运行良好,但在我正在处理的服务器上编译它时失败。基本上 execve 的执行失败。原来的程序不是太大,所以我开始剪掉一些部分,以试图了解问题可能出在哪里。

这里是程序的一个剪辑(它只是一个剪辑,所以当然它没有任何意义),好吧,这里 execve 仍然失败:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>

int main (){
    // Arguments
    char *argv[100] = {"/home/input/input", [1 ... 99] = "A"};

    //The real program would use some pipes later
    int pipestdin[2];
    int pipestderr[2];

    pipe(pipestdin);
    pipe(pipestderr);

    // Call
    char *env = "\xde\xad\xbe\xef=\xca\xfe\xba\xbe";
    execve("/home/input/input",argv,&env);  // Execute the program  
    printf("ERROR\n"); // printed only if execve fails

    return 0;

}

但是当我拿出这部分时:

    int pipestdin[2];
    int pipestderr[2];

    pipe(pipestdin);
    pipe(pipestderr);

程序又开始工作了。

这里有一些信息:

当我使用在我的电脑上编译的版本时,程序在服务器上正常运行,这就是为什么我认为编译器有问题。

【问题讨论】:

  • execve 失败的错误是什么? (提示:你当前的程序没有告诉你。你应该改变它,让它告诉你,用 perror 或 strerror(errno))
  • 您的 argv 和 envp 均构造不正确。阅读手册页。

标签: c gcc pipe execve


【解决方案1】:

argv 是一个 char* 数组,应以 NULL 指针终止。换句话说,最后一个有效元素后面的元素应该是NULL

envp 是一个类似的结构。您应该将您的envp 声明为char*[],就像您对argv 所做的那样,并将不带&amp; 的它传递给execve

请注意:大多数情况下,当您的程序无法运行时,这不是编译器错误。您的编译器和操作系统库已经过数百万次测试,如果有错误,通常会在它到达您之前修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2018-04-08
    • 2017-03-14
    • 1970-01-01
    • 2021-05-17
    • 2015-09-13
    相关资源
    最近更新 更多