2013-09-26 2 views
0

Я пытаюсь получить команду через родителя и выполнить ее в другом процессе (дочерний процесс).Переменные пути и переменные окружения

#include<stdio.h> 
#include<sys/types.h> 
#include<fcntl.h> 
#include<unistd.h> 
#include<stdlib.h> 
#include<malloc.h> 

int main(){ 
pid_t pid = -1; 
int status = -1; 
char* ip = malloc(20); 
char* a[20]; 
int pd[2]; 
char* path = NULL; 

path = getenv("PATH"); 
printf("\n path : %s \n",path); 

a[0] = malloc(10); 

while(1){ 
    pipe(pd); 
    pid = fork(); 
    if(pid == 0){ 
    //printf("\n Child! - pid : %d \n",getpid()); 
    sleep(1); 
    close(pd[1]); 
    read(pd[0],ip,20); 
    a[0] = ip; 
    //execl(ip,ip,NULL); 
    execv(path,a); 
    exit(0); 
    } 
    else{ 
    //printf("\n Parent! - pid : %d \n",getpid()); 
    printf("(Enter a executable)$ "); 
    scanf("%s",ip); 
    //printf("\n %s \n",ip); 
    close(pd[0]); 
    write(pd[1],ip,20); 
    waitpid(pid,&status,0); 
    //printf("\n The child %d exited with status : %d \n",pid,status); 
    } 
} 
free(ip); 
return 0; 
} 

В чем разница между дорогой и окружающей средой. Функция getenv дает мне весь путь к исполняемому файлу. Вышеупомянутая программа не выполняет команду ls -l.

Я хочу выполнить команды ls -l, и вывод должен отображаться на экране, а также должен храниться в файле. Я попытался выполнить команду ls -l. Но его не выполняет. Есть ли способ вывода ls -l в файл при его выводе на экран?

+0

Коды возврата, коды возврата, коды возврата. Сохраняйте время и здравомыслие с помощью 'perror' и/или' strerror'. – Duck

+0

Среда содержит пары строк имен переменных и их значений. PATH является одной из этих переменных и содержит пути к различным исполняемым файлам. Он может содержать один или (вероятно) * много * таких путей, разделенных двоеточием. Ваш 'execv' собирается вспыхнуть. Посмотрите, что вы распечатываете для пути. Посмотрите, что вы проходите как «a» на «execv». Затем сопоставьте их с тем, что ожидает 'execv', и заметьте, что не так. – Duck

ответ

1

Да, есть способ вывода на экран и в файл в одно и то же время, он называется tee.

ls -l | tee your_output_file 
+0

Действительно ли это то, о чем просит ОП? – Duck

+0

Я так думаю. По крайней мере, он решает последний вопрос в ОП. –

+0

Может быть. Сложно сказать. Я не мог понять, если это то, что он хочет отлаживать, или он хочет, чтобы его программа писала обоим. – Duck

0

Вы запускаете execv(path,a), используя path в качестве первого параметра, но вы установили path быть содержимое переменной в PATH среды. PATH - это список каталогов для оболочки для поиска исполняемого файла; первым аргументом execv должен быть путь исполняемого файла для вызова. (В качестве альтернативы execlp и некоторые другие варианты могут искать переменную окружения `PATH``.)

Есть еще некоторые проблемы с вашим кодом. Похоже, что все, что было напечатано, используется в качестве имени программы (например, оно будет искать исполняемый файл с пятисимвольным именем «ls -l») и будет разбиваться на команды длиной более 20 символов.

Смежные вопросы