2015-02-13 2 views
3

Я новичок в системных вызовах и программировании на С и работаю над своим университетским заданием.Вызов 'ls' с execv

Я хочу вызвать команду «ls» и распечатать ее.

Что у меня есть: (я добавил комментарии в так что вы можете увидеть, что я вижу, проходящий через каждую переменную

int execute(command* cmd){ 

    char full_path[50]; 
    find_fullP(full_path, p_cmd); 
    //find_fullP successfully updates full_path to /bin/ls 
    char* args[p_cmd->argc]; 
    args[0] = p_cmd->name; 
    int i; 
    for(i = 1; i < p_cmd->argc; i++){ 
     args[i] = p_cmd->argv[i]; 
    } 

/* 
* this piece of code updates an args variable which holds arguments 
* (stored in the struct) in case the command is something else that takes 
* arguments. In this case, it will hold nothing since the command 
* will be just 'ls'. 
*/ 

    int child_process_status; 
    pid_t child_pid; 
    pid_t pid; 

    child_pid = fork(); 

    if (child_pid == 0) { 
     execv(full_path, args); 
     perror("fork child process error condition!"); 
    } 

    pid = wait(&child_process_status); 
    return 0; 
} 

Я ничего происходит не видя и путаюсь, любая идея

+1

Использование 'opendir' , 'readdir' и' closedir' вместо использования внешней программы. –

+1

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

+0

@EdHeal Как вы думаете, получится ли полная оценка при представлении в качестве университетского задания? – Kaz

ответ

6

.? Вот минимальная программа, которая вызывает ls с помощью execv. Вещи отметить

  • список args должен включать в себя исполняемый файл как первый аргумент
  • список args должен быть нулем
  • если args настроены правильно, то args[0] может быть передан в качестве первого параметра execv

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

int main(void) 
{ 
    int status; 
    char *args[2]; 

    args[0] = "/bin/ls";  // first arg is the full path to the executable 
    args[1] = NULL;    // list of args must be NULL terminated 

    if (fork() == 0) 
     execv(args[0], args); // child: call execv with the path and the args 
    else 
     wait(&status);  // parent: wait for the child (not really necessary) 

    return 0; 
}