Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полный нокдаун системы 
V
    Опции темы
CPlusPlusFAN
Дата 28.6.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



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

выполняется 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 
PM MAIL ICQ Jabber   Вверх
MAKCim
Дата 28.6.2008, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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

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

Это сообщение отредактировал(а) MAKCim - 28.6.2008, 18:31


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
CPlusPlusFAN
Дата 28.6.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Код

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;
}

PM MAIL ICQ Jabber   Вверх
Бонифаций
Дата 29.6.2008, 03:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



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

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


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
MAKCim
Дата 29.6.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
CPlusPlusFAN
Дата 2.7.2008, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Извиняюсь, что долго не отвечал. Был в отъезде.

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

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

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

Это сообщение отредактировал(а) CPlusPlusFAN - 2.7.2008, 02:15
PM MAIL ICQ Jabber   Вверх
MAKCim
Дата 2.7.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
CPlusPlusFAN
Дата 3.7.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Вот архив со всеми файлами.

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

Это сообщение отредактировал(а) CPlusPlusFAN - 3.7.2008, 15:30

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  System.rar 26,08 Kb
PM MAIL ICQ Jabber   Вверх
CPlusPlusFAN
Дата 15.7.2008, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Ура!  smile Ошибка найдена!  smile 
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.