我的execv()函数在linux ubuntu中不起作用

时间:2014-10-05 14:22:37

标签: c linux ubuntu-14.04 execv

我编写了以下代码,但我总是得到输出:" ERROR!" (execv函数未安排返回)

我做错了什么???

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <malloc.h>
#include "LineParser.h"

#define LOCATION_LEN 200
char* getL(void);

int main(int argc,char *argv[])
{
    char *loc = getL();
    char *args[] = {loc,"ls",NULL};
    int i;
    execv(args[0],args);
    printf("ERROR!");
    free(loc);
}

char* getL(void)
{
    char *buff = (char**)malloc(sizeof(char)*LOCATION_LEN);
    getcwd(buff,LOCATION_LEN);
    return buff;
}

2 个答案:

答案 0 :(得分:2)

阅读execv(3)execve(2)以及perror(3)的文档。至少,你应该编码

int main(int argc, char *argv[]) {
  char *loc = getL();
  char *args[] = { loc, "ls", NULL };
  int i;
  execv(args[0], args);
  perror("execv");
  free(loc);
}

您应该使用gcc -Wall -g进行编译,然后使用gdb调试器。

你对execv的使用显然是错误的(你需要一个完整的路径,例如"/bin/ls",并且参数的顺序是错误的)。你可能想要exevcp(3),事实上你应该至少编码:

  char *args = { "ls", loc, NULL };
  execvp("ls", args);
  perror("execvp")

如果您坚持专门使用execv(3),可以尝试

  char *args = { "ls", loc, NULL };
  execv("/bin/ls", args);
  perror("execv")

我不明白你的代码应该做什么。您可能对glob(7)&amp; glob(3)

你可能应该阅读Advanced Linux Programming。似乎有几个你不太了解的概念。我想strace(1)对您有用(至少通过运行strace ls *.c来了解正在发生的事情)。

也许你的getL正是GNU函数get_current_dir_name(3)正在做的事情,但其中的(char**)强制转换是非常错误的。在调用memset(3)之前,你最好使用getcwd(2)清除缓冲区buff(你应该测试malloc and of getcwd`的失败)

也许您想要opendir(3)readdir(3)asprintf(3)stat(2);通过所有这些,您甚至可以避免运行ls

如果你正在编写一些shell,你应该strace一些现有的shell,在阅读了我在这里提供的所有参考文献后,研究free software shell的源代码,如sashGNU bash

答案 1 :(得分:0)

您没有将正确的参数传递给execv。第一个参数必须是您希望运行的可执行文件的路径,但是您将路径传递到当前工作目录。

更新getL以返回ls的完整路径。