-1

我在使用 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);

该程序再次开始工作。

以下是一些信息:

  • 我电脑上的 gcc 版本:4.8.4
  • 服务器上的 gcc 版本:4.6.3
  • 上述程序的组装:http: //pastebin.com/nTagaErP

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

4

1 回答 1

4

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

envp是一个类似的构造。你应该声明你的envpas char*[],就像你所做的一样,并且不通过toargv传递它。&execve

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

于 2016-01-14T02:13:20.443 回答