#shell #c #exec
#оболочка #c #exec
Вопрос:
Я пытаюсь написать программу, в которой она выполняет себя N раз, и каждый раз, когда она выполняет себя, значение x, начиная с 1, увеличивается. N должно быть единственным аргументом программы.
Например:
./exec_test.o 4
выведет:
Exec: 1
Exec: 2
Exec: 3
Exec: 4
Execs done
Мне удалось только уменьшить мои значения с 4 вместо увеличения до 4:
Вот мой код
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** args){
if (argc<2){ //Argument error handling
fprintf(stderr,"Usage %s number_of_iter",args[0]);
exit(EXIT_FAILURE);
}
int x = atoi(args[1]); //x = the argument used when executing
*args[1]-=1; //decrement the argument value
if (x>0){
printf("Exec : %d n",x); //printing current argument
execv(args[0],args); //exec itself with argument decremented
perror(args[0]);
exit(1);
}
printf("Execs done n");
}
и ее выполнение приводит к этому:
Exec: 4
Exec: 3
Exec: 2
Exec: 1
Execs done
Возможно ли увеличить x с 1 вместо уменьшения с N, используя только один аргумент для программы?
Комментарии:
1. Вы внимательно прочитали документацию exec (3) , execve(2) , fork(2) , waitpid (2)
Ответ №1:
ДА. Вы можете хранить две информации (текущее и максимальное количество) в одном аргументе.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** args){
if (argc<2){ //Argument error handling
fprintf(stderr,"Usage %s number_of_iter",args[0]);
exit(EXIT_FAILURE);
}
int max, x = 1; // set x to 1 for the first iteration (it will fail to read x)
char next_argument[128];
char* next_args[3];
sscanf(args[1], "%d_%d", amp;max, amp;x);
if (x <= max){
printf("Exec : %d n",x); //printing current argument
// create next argument
snprintf(next_argument, sizeof(next_argument), "%d_%d", max, x 1);
next_args[0] = args[0];
next_args[1] = next_argument;
next_args[2] = NULL;
execv(args[0],next_args); //exec itself with argument incremented
perror(args[0]);
exit(1);
}
printf("Execs done n");
}