Не выполнять одну и ту же команду дважды или более в execvp

Я использую execvp для выполнения некоторых команд, таких как ls -l, who, cp -r ./aaa ./bbb и т. д. Все в порядке, пока я не попытаюсь выполнить ту же команду во второй раз. Например, я покажу вам порядок, в котором я использую: ls -l (все в порядке), who (все в порядке), ls -l (неверный адрес). Это мой код:

if(strcmp(com_instr, "issuejob") == 0)
{
        pid = fork();

        if(pid < 0)
        {           
            perror("Fork");
            exit(1);
        }

        else if(pid == 0)
        {                   
            sleep(0.1);

            //number of args
            read(fd, &t_args, sizeof(int));

            printf("t_args %d\n",t_args);

            commands = malloc(t_args*sizeof(char *));

            for(i=0; i<t_args; i++)
            {
                commands[i] = malloc(SIZE*sizeof(char));
            }   

            for(i=0; i<t_args; i++)
            {
                read(fd, commands[i], SIZE);
            }               

            //Receiving data from named-pipe

            /*temp_run = run_node->next;
            while(temp_run != NULL)
            {
                printf("jjjjjjjjjjjjjjjjjjjj %d",temp_run->job_id);
                temp_run = temp_run->next;
            }*/

            printf("command %s\n", commands[0]);        
            execvp(commands[0], commands);
            perror("execvp");
            exit(1);
        }

        else if(pid > 0)
        {
            temp_run = run_node; 
            for(i=0; i<run_num; i++)
            {
                if(temp_run->next != NULL) temp_run = temp_run->next;
                else break;                 
            }

            if((i <= run_num-1) && (wait_node->next == NULL))
            {
                temp_run->next = malloc(sizeof(run_list));
                temp_run = temp_run->next;
                saving_data_run(temp_run, j_id, line, 1, arg_num-1, pid);
                printf("pid:%d\n",temp_run->pid);
                ++running;
                send_data_for_exec(line, arg_num-1, fd);
            }

            else
            {
                temp_wait = wait_node;
                while(temp_wait->next != NULL) temp_wait = temp_wait->next;
                temp_wait->next = malloc(sizeof(wait_list));
                saving_data_wait(temp_wait, j_id, line, 0, arg_num-1, pid);
                wait_num++;
            }

        }

    j_id++;
}    

Я использую именованные каналы для передачи своих аргументов в командах char **. Аргументы правильно передаются командам char **, я проверил это с помощью printf. Есть ли проблема с выполнением одной и той же команды более одного раза в execvp? Заранее спасибо!


person a_user    schedule 15.06.2014    source источник
comment
Я предполагаю, что вы сначала разветвляетесь, поскольку execvp заменяет вызывающий процесс новой программой? Проблема может быть связана с вилкой. Нам было бы намного проще, если бы вы могли предоставить полный минимальный пример, который все еще демонстрирует проблему.   -  person Thomas Padron-McCarthy    schedule 15.06.2014
comment
Да, я использую fork(). попробую отредактировать.   -  person a_user    schedule 15.06.2014
comment
Предоставьте полный воспроизводимый пример. Часто проще обнаружить проблему, запустив программу и увидев, где она дает сбой, чем глядя на код.   -  person Gilles 'SO- stop being evil'    schedule 15.06.2014


Ответы (1)


Я обеспокоен тем, что вы используете:

        for(i=0; i<t_args; i++)
        {
            read(fd, commands[i], SIZE);
        } 

Это всегда будет считывать байты размера из вашего файла (или канала?) Каждый раз, когда вы вызываете чтение. Возможно, ваш файл построен правильно, но мне интересно, не извлекаете ли вы случайно слишком много данных в этих командах чтения.

Например, если ваш файл/канал был заполнен следующим:

2, 'l', 's', ' ', '-', 'l', '\0', 1, 'c', 'd', '\0', 2, 'l', 's', ' ', '-', 'l', '\0'

И SIZE был #define'd равным 80, тогда при первом вызове вы читали бы 2 в t_args, но при первом чтении остальные данные могли бы использоваться в командах[0]. Второе чтение в commands[1] не будет содержать данных.

Из вашего описания неясно, как выглядят ваши данные ... может быть хорошей идеей распечатать их в цикле байт за байтом после каждого вызова чтения вместе с возвращаемым значением чтения. Обычно чтение возвращает вам количество фактически прочитанных байтов... вы можете использовать это, чтобы помочь проверить ваш ответ на вменяемость.

Надеюсь, это поможет, - Дж.

person jrjbertram    schedule 15.06.2014