использование exe c с параметрами c - PullRequest
0 голосов
/ 13 апреля 2020

Я создал программу, которая получает путь к каталогу, компилирует файлы в папках этого каталога и выполняет их.

Теперь я попытался использовать execl, но я не знаю, как называется исполняемый файл. файлы будут до запуска программы.

Поскольку имя файла - это имя папки, в которой он находится (например, у меня есть .../omer/omer.c, и я компилирую его в omer) теперь, когда я выполняю Я хочу сделать что-то подобное для правильной работы:

execl("./omer","./omer",NULL);

Я пытался это сделать (у меня есть имя файла):

execl("./%s",fileName,"./%s",fileName);

, но это не ничего не делать Теперь проблема в том, что я не могу использовать strcat(), поэтому я стараюсь избегать создания функции для создания строки, в начале которой стоит «./».

Есть ли способ делать то, что я пытался, не используя что-то вроде strcat() или нет способа избежать этого (в основном я хочу вставить пользовательскую строку в execl)?

Спасибо за помощь!

edit : добавление кода по запросу:

cFilePath = 
readStudentcFilePath(confContent[0],studentName,strLeng(confContent[0]));
pid = fork();
if(pid<0)
{
  fprintf(stderr, "Forking Error!\n");
  exit(FORK_ERR);
}
if(pid == 0)
{
  execl("/usr/bin/gcc","gcc",cFilePath,"-o",studentName,NULL);
  fprintf(stderr, "Failed to Execute file 'gcc' \n");
  exit(EXEC_ERR);
}
pid = fork();
if(pid<0)
{
  fprintf(stderr, "Forking Error!\n");
  exit(FORK_ERR);
}
if(pid == 0)
{
  studentOutFd = open("test_output.txt",O_WRONLY|O_TRUNC|O_CREAT);
  if(studentOutFd < 0 )
  {
    fprintf(stderr, "Error Opening File 'test_output.txt'\n");
    exit(FILE_OPEN_ERR);
  }
  dup2(STDIN_FILENO,inFd);
  dup2(STDOUT_FILENO,studentOutFd);
  execl("./%s",studentName,"./%s",studentName,NULL);
  fprintf(stderr, "Error Executing File %s\n", studentName);
  exit(EXEC_ERR);
}

1 Ответ

1 голос
/ 13 апреля 2020

Нет необходимости добавлять "./" к имени файла, если вы используете execl (или любой вариант exec, в имени которого нет p). Все эти версии exec интерпретируют свой первый аргумент как путь как обычно; то есть как абсолютный путь, если он начинается с /, и как путь относительно текущего рабочего каталога в противном случае.

Варианты exec, в имени которых есть p (execlp, execvp, et c.), По-разному интерпретируют свой первый аргумент, если он не содержит / , В этом случае поиск пути производится в каталогах, перечисленных в переменной среды PATH (или по умолчанию для библиотеки c, обычно /usr:/usr/bin). Поскольку . обычно не входит в PATH, имя файла не будет искать в текущем рабочем каталоге.

Поскольку используемая оболочка дублирует работу execlp, вы не можете запускать исполняемые файлы в текущий рабочий каталог, просто указав их имя файла. Вы должны написать ./omer вместо omer. (Если, конечно, вы не добавите . к своему PATH. По соображениям безопасности это не рекомендуется.) Поскольку ./omer включает в себя sla sh, поиск PATH не выполняется.

Но это не относится к execl, поэтому нет необходимости включать / для принудительного использования в качестве относительного пути.

Если вы чувствовали необходимость указать определенный каталог (например, /usr/share/lib/myapp), тогда вам нужно будет объединить путь к файлу. В этом случае, если вы не можете использовать strcat (или не хотите его использовать), вам придется написать свою собственную функцию конкатенации. Расширение %s не является синтаксисом языка. Это часть printf и связанных библиотечных функций. (Одна из этих связанных функций - snprintf, которая обычно является более безопасным и более удобным способом создания строки во время выполнения, чем повторные вызовы strcat. Однако, если strcat недоступен для вас, кажется маловероятным, что snprintf есть.)

...