Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Полный нокдаун системы


Автор: CPlusPlusFAN 28.6.2008, 18:21
Здравствуйте. Дело в том, что моя программа отправляет систему в глубокий нокдаун по непонятной мне причине. Вот как моя программа работает:

выполняется 23 итерации цикла, в каждой из которых происходит
1) копирование файлов и
2) запуск другой программы (всё посредством system), далее
3) с помощью glob проверяется наличие файла, и если он существует, то
4) выполняется запуск ещё 1 программы с передачей данных через пайпы.

Самое интересное, если убрать действие 4), то всё работает очень быстро, а если вернуть, то происходит следующее:

выполняется 6-8 итераций с нормальной скоростью, затем до 12-той итерации со скрипом и дальше система виснет, причём винчестер усиленно работает.  smile 

Вот функция, выполняющая шаг 4):

Код

bool TestResult(char *program,char *input,char *output,char *answer)
{
    bool result;
    int pipe_fd[4],pid;
    char buffer[10]="";
    
    pipe(pipe_fd);
    pipe(&pipe_fd[2]);
    
    pid=fork();
    
    if (pid==0)
    {
        close(pipe_fd[1]);
        close(pipe_fd[2]);
        dup2(pipe_fd[0],STDIN_FILENO);
        dup2(pipe_fd[3],STDOUT_FILENO);
        execl(program,NULL);
    }
    else
        if (pid<0)
        {
            perror(NULL);
            return errno;
        }
    
    close(pipe_fd[0]);
    close(pipe_fd[3]);
    write(pipe_fd[1],input,strlen(input));
    write(pipe_fd[1],"\n",1);
    write(pipe_fd[1],output,strlen(output));
    write(pipe_fd[1],"\n",1);
    write(pipe_fd[1],answer,strlen(answer));
    write(pipe_fd[1],"\n",1);
    read(pipe_fd[2],buffer,10);
    result=buffer[0]=='1';
    
    return result;
}


Возможно, это связано с появлением сильного ветвления процессов. Помогите решить эту проблему. Буду очень благодарен.  smile 

Автор: MAKCim 28.6.2008, 18:31
Цитата(CPlusPlusFAN @  28.6.2008,  18:21 Найти цитируемый пост)
Возможно, это связано с появлением сильного ветвления процессов

возможно
но 23 процесса - это не сильно много (хотя плодить зомби не следует  smile )

если программа не большая, выложи весь код

Автор: CPlusPlusFAN 28.6.2008, 22:25
Код

sys/resource.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <glob.h>
#include <stdlib.h>
#include <errno.h>

bool TestResult(char *program,char *input,char *output,char *answer)
{
    bool result;
    int pipe_fd[4],pid;
    char buffer[10]="";
    
    pipe(pipe_fd);
    pipe(&pipe_fd[2]);
    
    pid=fork();
    
    if (pid==0)
    {
        close(pipe_fd[1]);
        close(pipe_fd[2]);
        dup2(pipe_fd[0],STDIN_FILENO);
        dup2(pipe_fd[3],STDOUT_FILENO);
        execl(program,NULL);
    }
    else
        if (pid<0)
        {
            perror(NULL);
            return errno;
        }
    
    close(pipe_fd[0]);
    close(pipe_fd[3]);
    write(pipe_fd[1],input,strlen(input));
    write(pipe_fd[1],"\n",1);
    write(pipe_fd[1],output,strlen(output));
    write(pipe_fd[1],"\n",1);
    write(pipe_fd[1],answer,strlen(answer));
    write(pipe_fd[1],"\n",1);
    read(pipe_fd[2],buffer,10);
    result=buffer[0]=='1';
    
    return result;
}

char config[1000], inputsrc[1000], answer[1000], str[1000], checker[1000];
 
int main(int argc,char* argv[])
{
    //argv[1] - директория с решением
    //argv[2] - решение
    //argv[3] - директория с тестами
    //argv[4] - номер сабмита
    
    glob_t gl;
    
    chdir(argv[1]);

    glob(argv[2],GLOB_NOSORT|GLOB_ERR,NULL,&gl);
    
    if (gl.gl_pathc==0)
        printf("Compilation Error\n");
    else
    {
        printf("Compilation successful\n");

        strcpy(config,argv[3]);
        strcat(config,"/conf");
        
        FILE *conf=fopen(config,"r");
        int time,memory,count;
        fscanf(conf,"%d%d%d",&time,&memory,&count);
        fclose(conf);
        
        strcpy(inputsrc,argv[3]);
        strcat(inputsrc,"/i");
        int len1=strlen(inputsrc);
        
        strcpy(answer,argv[3]);
        strcat(answer,"/o");
        int len2=strlen(answer);
        
        strcpy(checker,argv[3]);
        strcat(checker,"Check.core");
        
        for (int i=1;i<=count;i++)
        {
            printf("Test %d ... ",i);
            sprintf(&inputsrc[len1],"%d",i);
            sprintf(&answer[len2],"%d",i);

            sprintf(str,"exec cp -f %s input.txt",inputsrc);
            system(str);
            memset(str,'\0',strlen(str));
            sprintf(str,"exec ./%s",argv[2]);
            system(str);
            memset(str,'\0',strlen(str));
            
            glob("output.txt",GLOB_NOSORT|GLOB_ERR,NULL,&gl);
    
            if (gl.gl_pathc==0)
                printf("Crash(no output file)\n");
            else
            {
                printf("OK\n");
                if (TestResult(checker,"input.txt","output.txt",answer))
                    printf("Accepted\n");
                else
                    printf("Wrong answer\n");    
                
                system("exec rm -f output.txt");
            }
        }
    }
    
    return 0;
}

Автор: Бонифаций 29.6.2008, 03:07
А сколько ресурсов у вас съедает этот Сheck.core ? Може дело просто в том что отработанные check.core остаются в памяти, вся память сьедается и систему уходит в своп? Что vmstat показывает когда система тормозит? (параметры si и so в частности)

PS. А вообще зачем это все на C писать? задачка для шелла..

Автор: MAKCim 29.6.2008, 09:28
CPlusPlusFAN, 
заархивируй и скинь сюда окружение (то, к чему применяется программа)
попробую разобраться

Автор: CPlusPlusFAN 2.7.2008, 02:12
Извиняюсь, что долго не отвечал. Был в отъезде.

Цитата(Бонифаций @  29.6.2008,  03:07 Найти цитируемый пост)
PS. А вообще зачем это все на C писать? задачка для шелла..

Там надо будет ещё в БД записывать.

У меня вопрос, что отсылать? Файлы, которые копируются, запускаются и удаляются программой?

Автор: MAKCim 2.7.2008, 09:58
Цитата(CPlusPlusFAN @  2.7.2008,  02:12 Найти цитируемый пост)
У меня вопрос, что отсылать? Файлы, которые копируются, запускаются и удаляются программой?

все, что необходимо для корректной работы программы (чтобы можно было тестировать)

Автор: CPlusPlusFAN 3.7.2008, 15:28
Вот архив со всеми файлами.

ЗЫ Чё то он отказался .tar.gz присоединять, пришлось винраром его.

Автор: CPlusPlusFAN 15.7.2008, 01:35
Ура!  smile Ошибка найдена!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)