Мне нужно создать программу, которая позволяет пользователю выполнять команду, переданную в качестве аргумента, с помощью execve в Linux. Я не уверен в синтаксисе команды execve. Я написал программу, но она не работает с несколькими аргументами, и я не могу понять, почему.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
int main(int argc, char **argv)
{
int status;
pid_t pid;
if((pid = fork())>0)
{
///Father process
wait(&status);
printf("Process terminated with status = %d\n",status);
}
else
{
///son process
int i;
char param[100];
printf("I'm the son woth PID= %d\n",getpid());
printf("%s\n",argv[0]);
printf("%s\n",argv[1]);
printf("%s\n",argv[2]);
strcpy(param,"/bin/");
strcat(param,argv[1]);
execve(param,argv,NULL);
exit(-1);
}
return 0;
}
Команда, которая не работает с использованием этого кода,
cp file1.txt file2.txt
Кто-нибудь может мне помочь?
argv[2]
? Либо вы получите сообщение об ошибке отprintf
, либо вы не сможете передать аргумент вместе с командойargv[1]
. - person Weather Vane   schedule 08.05.2017execve()
не выполняет поиск команды для выполнения на основе PATH. Если у вас нет двоичного файла./cp
в текущем каталоге, команда не будет работать, потому что она не может найти исполняемый файл. Непрохождение какой-либо среды является жестоким и необычным наказанием, хотяcp
, вероятно, не пострадает. На многие другие команды никакая среда не повлияет. Лучше использоватьexecv()
илиexecvp()
— или дажеexecvpe()
, если ваша платформа поддерживает это (Linux поддерживает, а macOS и многие другие системы — нет). - person Jonathan Leffler   schedule 08.05.2017