Я хотел бы получить команду which
в качестве параметра execv
. Например, пользовательские типы «firefox» в качестве входных данных. Он покажет путь к файлу с командой which firefox
, и я бы хотел использовать его в execv
. Вот моя попытка:Системная команда как переменная в C
int main(void)
{
//char inputBuffer[MAX_LINE]; /*buffer to hold command entered */
char *args[MAX_LINE/2 + 1]; /*command line arguments */
while (1){
char command1[50] = "which ";
char *input = args[0]; /* args[0] holds input */
strcat(command1,input);
char *const parmList[] = {input,NULL};
char buf[100]; /* will convert command to the file path */
char *str;
FILE *file;
if (NULL == (file = popen(command1, "r"))) {
perror("popen");
exit(EXIT_FAILURE);
}
while (fgets(buf, sizeof(buf), file) != NULL) {
}
pclose(file);
int count=0;
for(int m=0;m<buf[m];m++){
if(buf[m] != ' ')
count++;
}
char x5[count];
for(int t=0;t<=count;t++){
x5[t]=buf[t];
}
printf("%s\n\n\n\n",x5); /*i tried to delete spaces from 'buf'
but there is something wrong in file path the output is something like that :
(input : firefox)
usr/bin/firefox
(some weird characters)
because of weird characters execv don't get filepath correctly. I have to this
only with execv
*/
pid_t childpid;
childpid = fork();
if (childpid == -1) {
printf("error");
}
if (childpid == 0) {
execv(x5, parmList);
}
}
}
в вызове 'strcat', у вас есть аргументы в обратном направлении – DBug
[yawn], кто-то говорит суммирование? –
Эта строка: 'char * input = args [0]; не будет работать по нескольким причинам. 1) объявление 'main()' не является 'int main (int argc, char * args [])', поэтому аргументы [0] недоступны, и эта строка: 'char * args [MAX_LINE/2 + 1] ; 'только объявляет массив указателей на указатели на char, он не дает ни одному из этих указателей какое-либо полезное значение. – user3629249