我编写了以下代码,但我总是得到输出:" 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;
}
答案 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的源代码,如sash和GNU bash
答案 1 :(得分:0)
您没有将正确的参数传递给execv。第一个参数必须是您希望运行的可执行文件的路径,但是您将路径传递到当前工作目录。
更新getL
以返回ls
的完整路径。