argv[0]
всегда считается именем программы, даже если оно не используется execvp
, как в вашем случае. Сама программа cal
начинает интерпретировать командную строку с argv[1]
. (См. @Kiran Biradar answer.)
Вам нужно будет скопировать (указатели на) аргументы в больший массив и установить фиктивный аргумент для argv[0]
. Вот небольшой код для этого:
char **combine_args(char *arg0, char **tail) {
size_t n = 0;
while(tail[n]) ++n;
char **ret = malloc(sizeof(char*)*(n+2));
ret[0] = arg0;
memcpy(ret + 1, tail, sizeof(char*)*n);
ret[n+1] = 0;
return ret;
}
Далее вы можете использовать его так:
char *const temp[] = {"cal"};
char *const temp2[] ={"4","2019",NULL};
char **argv = combine_args(temp[0], temp2);
execvp(argv[0], argv);
perror("Return from execlp not expected");
exit(EXIT_FAILURE);
Если вы делаете это в цикле и можете изменить массив temp2
, то вы можете сделать это следующим образом, без каких-либо выделений:
char *const temp[] = {"cal", "cal2", "cal3", NULL};
char *temp2[] ={NULL, "4","2019",NULL};
for(int i = 0; temp[i]; ++i)
{
// ... fork here ...
{
temp2[0] = temp[i];
execvp(temp2[0], temp2);
perror("Return from execlp not expected");
exit(EXIT_FAILURE);
}
}