2016-02-21 2 views
2

Я пытаюсь использовать execlp в программе c для запуска другой c-программы. Функция exec выполняет вызов программы, но она не передает правильные аргументы. Мой Exec вызов:Как передать аргументы командной строки программе C с помощью execlp

int exec_arg_1, exec_arg_2; 

if(pid == 0){ 
    printf("Repeat Number: %d, Process Number: %d\n", exec_arg_1, exec_arg_2); 
    execlp("/home/drlight/Desktop/asp/Assignment_3/philosopher.o", 
     "philosopher.o", &exec_arg_1, &exec_arg_2, NULL); 
      printf("Exec didn't work...\n"); 
    } 

Я присвоить значения exec_arg Интс, и печатать их прямо перед тем, чтобы убедиться, что они правы, но функция philosopher.o просто читает 0 от местоположения. Если я запустил philosopher.o из командной строки, он нормально читает аргументы.

+2

Почему бы просто не взглянуть на страницу руководства для 'execlp', чтобы узнать, какие типы аргументов он принимает? Вы вызываете неопределенное поведение. – Olaf

+0

Просто поймите, что разработчики Unix/Linux могут обрабатывать только текст. Учитывая двоичное представление, скажем, целого числа, их мозг взрывается. –

+0

Я пробовал передавать массивы char, но та же проблема возникает. Кроме того, я думал, что целые числа и символы являются взаимозаменяемыми в большинстве ситуаций на C. Я не получал никаких предупреждений компилятора. – Spence123

ответ

3

Аргументы для программ всегда являются строками.

int exec_arg_1, exec_arg_2; 

if (pid == 0){ 
    printf("Repeat Number: %d, Process Number: %d\n", exec_arg_1, exec_arg_2); 
    char arg1[20], arg2[20]; 
    snprintf(arg1, sizeof(arg1), "%d", exec_arg_1); 
    snprintf(arg2, sizeof(arg2), "%d", exec_arg_2); 
    execlp("/home/drlight/Desktop/asp/Assignment_3/philosopher.o", 
     "philosopher.o", arg_1, arg_2, NULL); 
    fprintf(stderr, "Exec didn't work...\n"); 
    exit(1); 
} 

Обратите внимание, что execlp() действительно полезно только с фиксированным числом аргументов (или, наименьшее, когда есть небольшая фиксированная верхняя граница числа аргументов). Чаще всего execvp() - лучший выбор.

1

This page включает в себя множество примеров использования ....

EDIT: Добавлен фрагмент кода из ссылки фрагмент кода по ссылке выше

static void show_info_page(const char *git_cmd) 
{ 
    const char *page = cmd_to_page(git_cmd); 
    setenv("INFOPATH", system_path(GIT_INFO_PATH), 1); 
    execlp("info", "info", "gitman", page, (char *)NULL); 
    die(_("no info viewer handled the request")); 
} 

Лучшая практика будет иметь взгляд на the execlp(3) man page во-первых, я считаю.

EDIT: Добавлено объяснение этих функций имеют (3) сюда mthe человек страницы страница человек FreeBSD объясняет использование этих функций имеют() следующим образом

int 
execlp(const char *file, const char *arg, ... /*, (char *)0 */); 

The initial argument for these functions is the pathname of a file which 
is to be executed. 

The const char *arg and subsequent ellipses in the execl(), execlp(), and 
execle() functions can be thought of as arg0, arg1, ..., argn. Together 
they describe a list of one or more pointers to null-terminated strings 
that represent the argument list available to the executed program. The 
first argument, by convention, should point to the file name associated 
with the file being executed. The list of arguments must be terminated 
by a NULL pointer. 

The functions execlp(), execvp(), and execvP() will duplicate the actions 
of the shell in searching for an executable file if the specified file 
name does not contain a slash ``/'' character. For execlp() and 
execvp(), search path is the path specified in the environment by 
``PATH'' variable. If this variable is not specified, the default path 
is set according to the _PATH_DEFPATH definition in <paths.h>, which is 
set to ``/usr/bin:/bin'' 

PS: некоторые данные, такие как пути поиска по умолчанию, мат меняться на основе вашей системы

+0

Обратите внимание, что ссылки только ответы считаются низкими качествами на SO и могут быть помечены для удаления.Официальная публикация SO: «Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится ». – kaylum

+0

Отредактировано сообщение с дополнительной информацией –

0

Ваша проблема заключается в том, что excelp принимает строковые указатели, а не целые числа для параметров arg. Из справочной системы

int execlp(const char *file, const char *arg, ...); 

Вам необходимо преобразовать их в строки, прежде чем передавать их в execlp.

#include<stdio.h> 
#include<unistd.h> 

#define MAXDIGITS 22 

main() 
{ 
    int exec_arg_1, exec_arg_2; 

    char execStr1[MAXDIGITS + 1]; 
    char execStr2[MAXDIGITS + 1]; 

    exec_arg_1 = 750; 
    exec_arg_2 = 25; 

    snprintf(execStr1, MAXDIGITS + 1, "%d", exec_arg_1); 
    snprintf(execStr2, MAXDIGITS + 1, "%d", exec_arg_2); 

    printf("Our Strings: %s, %s\n", execStr1, execStr2); 
    execlp("/home/drlight/Desktop/asp/Assignment_3/philosopher.o", "philosopher.o", execStr1, execStr2, NULL); 
} 

Вы должны убедиться, что MAXDIGITS является достаточно большим, чтобы вместить все десятичные цифры номера, но 25 должен быть достаточно даже для длинных позиций на большинстве современных платформ. Однако имейте в виду, что в будущих версиях gcc и/или с разными компиляторами это может быть другим. Не забудьте оставить место для негатива. Вы можете проверить эти максимумы, импортировав limits.h и распечатав значения INT_MAX и LONG_MAX.

#include<stdio.h> 
#include<limits.h> 

main(int argc, char * argv[]) 
{ 
    printf("Int max: %d\n", INT_MAX); 
    printf("Long max: %ld\n", LONG_MAX); 
} 
Смежные вопросы