2014-10-05 2 views
-3

Я написал следующий код, но я всегда получаю выход: «ERROR» (Функция execv не планируется возвращать)мой execv() функция не работает в Linux Ubuntu

Что я делаю не так ???

#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

Во-первых, проверьте ERRNO по возвращению из 'execv'. Затем проверьте параметры, которые вы передаете. – Duck

+0

Возврат execv -1 – Roni

+1

Конечно, он возвращает -1. Используйте 'errno' и' strerror' или 'perror', чтобы объяснить, почему ... а именно ваши параметры. – Duck

ответ

0

Вы не передаете правильные аргументы execv. Первым аргументом должен быть путь к исполняемому файлу, который вы хотите запустить, но вы передаете путь к текущему рабочему каталогу.

Update getL вернуть полный путь к ls.

+0

что такое полный путь к ls? – Roni

+1

Запустите 'which ls' в терминале, чтобы это знать. очень часто это '/ bin/ls' –

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) & glob(3).

Вы, вероятно, следует читать Advanced Linux Programming. Кажется, есть несколько понятий, которые вы недостаточно хорошо понимаете. Я думаю, что strace(1) может быть вам полезен (по крайней мере, запустив strace ls *.c, чтобы понять, что происходит).

Возможно, ваш getL - это именно то, что делает функция GNU get_current_dir_name(3), но в этом случае (char**) литье внутри. И вы должны лучше очистить буфер buff используя memset(3) перед вызовом getcwd(2) (и вы должны проверить на провал таНос and of getcwd`)

Может быть, вы хотите opendir(3), readdir(3), asprintf(3), stat(2); со всем этим, можно даже избежать запуска ls

Если вы кодирование некоторой оболочки, вы должны strace некоторых существующие оболочек, и, прочитав все ссылки я даю здесь, изучать исходный код free software оболочек как sash и GNU bash

+0

спасибо Но нужно использовать в execv, так что вы можете объяснить мне, как это работает? Я не понял параметры функции. – Roni

+0

Прочитайте все ссылки, которые я вам дал (это займет несколько часов чтения). Я не буду пытаться объяснить, какие ссылки, которые я вам дал, объясняют лучше, чем я мог бы объяснить через несколько минут. И, пожалуйста, * отредактируйте свой вопрос *, чтобы * улучшить его *. –

+0

Я попробовал то, что вы сказали Но она по-прежнему не работает http://www.siz.co.il/my.php?i=yme2vgnyyt1y.png – Roni