Программа, которая использует exec() для себя — проблема со значением

#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");

}