LINUX.ORG.RU

Сообщения gwyllum

 

Процесс выводит сообщение два раза

Форум — Development

Здравствуйте. Разбираюсь с процессами в linux. С-но есть задача - несколько процессов по очереди создают друг-друга и общаются различным способом(fifo, pipe и т.п.) Зеленый процесс создает желтый, тот фиолетовый, а тот - оранжевый. Оранжевый читает со стандартного потока список файлов в директории, узнает их количество и передает желтому через fifo

т.е. З->Ж->Ф->О

прогу компилирую с помощью файла, который содержит следующие инструкции:

#!/bin/bash
clear
echo "--------"
echo ""
gcc code.cpp -o proga -pthread
ls -1 |./proga
echo ""
echo "--------"

т.е. передаю моей проге список файлов. все было нормально, пока не начал использовать fifo для передачи информации. Во-первых, теперь часто выводится горизонтальная линия(которая выводится командой echo "--------"), а после продолжается вывод программы, хотя по идее она должна выводится только после завершения программы. Во-вторых, сообщение о чтении из fifo повторяется два раза, чего по идее быть не должно.

т.е.должно быть так

------
сообщения процессов
читаем из fifo
сообщения процессов
-----

а выглядит так:

------
сообщения процессов
-----
читаем из fifo
читаем из fifo
сообщения процессов

Я думал, что возможно дело в том, что какой-то процесс завершается раньше и начинается такая каша. Пробовал использовать waitpid, но тогда программа зависает и отображает моргающий курсор. Я так понимаю, это связано с тем, что ожидается информация из fifo, которой нет.

Буду очень благодарен, если подскажете как поступать в таких случаях. На всякий выкладываю код

int main()
{

   int     fifo;//дескриптор. будет использоваться для чтения-записи fifo
   char    fifo_string[MAX_BUFER_SIZE];//строка для чтения из fifo
   char    fifo_name[] = "aaa.fifo";//имя канала
   ssize_t size;

  //стартует зеленый процесс

  green_process=getpid();

  fprintf(stderr, "GREEN:\tработает зеленый процесс, его id:  %d \n", green_process);

  yellow_process=fork();

  switch(yellow_process)
  {
    case -1:
      critical_error("Ошибка работы желтого процесса");
      break;

    case 0://значит это желтый процесс
      yellow_process=getpid();
      fprintf(stderr, "YELLOW:\tработает желтый процесс, его id:  %d \n", yellow_process);

        //стартуем фиолетовый процесс
      purple_process=fork();

      switch(purple_process)
      {
        case -1:
          critical_error("Ошибка создания фиолетового процесса");
          break;

        case 0://значит это фиолетовый процесс
          purple_process=getpid();
          fprintf(stderr, "PURPLE:\tработает фиолетовый процесс, его id:  %d \n", purple_process);
          break;

        default://продолжает работать желтый процесс

        //стартуем оранжевый процесс
        orange_process=fork();

        switch(orange_process)
        {
          case -1:
            critical_error("Ошибка создания оранжевого процесса");
            break;

          case 0://значит это оранжевый процесс
            orange_process=getpid();
            fprintf(stderr, "ORANGE:\tработает оранжевый процесс, его id:  %d \n", orange_process);
            /*
            получает со стандартного
            потока ввода список файлов каталога, и выводит их на экран, добавляя перед
            каждым именем порядковый номер
            */
            fprintf(stderr, "ORANGE:\tполучаем список файлов каталога:\n");
            char *text;
            text=get_strings();

            printf("%s\n", text);

            //вычисляем количество файлов
            int count_files;
            count_files=get_count_strings(text);

            //переводим это число в строку

            char strNumber[MAX_BUFER_SIZE];

            sprintf(strNumber, "%d", count_files);

              //создаем фифо
            if(mkfifo(fifo_name,0666) < 0 && errno != EEXIST)
            {
               critical_error("Ошибка создания FIFO");
            }

            if((fifo = open(fifo_name, O_WRONLY)) < 0)
            {                          
               critical_error("Can't open FIFO for writting");
            }

            size = write(fifo, strNumber, strlen(strNumber));//пишем байты в fifo
           
          
            if(size != strlen(strNumber))//если в fifo не записалась информация, останавливаем программу
            {
                critical_error("Can't write all string to FIFO");
            }

            close(fifo);


            break;

            default:
            //продолжает работать фиолетовый процесс
            fprintf(stderr, "Продолжает работать фиолетовый процесс\n" );

        }
        //продолжает работать желтый процесс
        
        //считываем из fifo информацию оранжевого процесса

        if((fifo = open(fifo_name, O_RDONLY)) < 0)
          {
            critical_error("Can't open FIFO for reading");
          }

          size = read(fifo, fifo_string, MAX_BUFER_SIZE);

          if(size < 0)
          {
            critical_error("Can't read string from FIFO");
          }

          fprintf(stderr, "YELLOW:\t читаем из fifo количество файлов: %s \n", fifo_string);
          

          close(fifo);
        
      }

      break;

    default:
      //продолжает работать зеленый процесс. создаем следующую ветку

      
      fprintf(stderr, "GREEN:\tпродолжает работать зеленый процесс, его id:  %d \n", yellow_process);

  }

   return 0;
}

 , ,

gwyllum
()

Pthread и fork

Форум — Development

Доброго времени суток. Разбираюсь с бинарными семафорами(мьютексами). До этого всегда для порождения новых процессов использовал fork, однако для мьютексов нашел только примеры где используется pthread_create. Отсюда вопрос - в чем разница между ними и означает ли приставка pthread в названии функции pthread_mutex_lock, что его можно использовать только для процессов порожденных через pthread_create? Как в таком случае синхронизировать процессы, порожденные fork'ом?

Не пинайте пожалуйста за ламерские вопросы. Заранее огромное спасибо!

 , ,

gwyllum
()

php-многопоточность

Форум — Development

Доброго времени суток. С-но есть задача - реализовать многопоточное общение с сервером по API. Суть такая - пользователь загружает файл для распознавания, получает id, по которому потом делает запрос. Если распознавание готово - получает один ответ, если не готово - другой. В этом случае запрос повторяется. Делаю это с помощью curl. Нашел функцию curl_multi_init Здесь , однако в примере указано, что сперва формируются несколько соединений, а уже потом запускаются все сразу в цикле. У меня же ситуация следующая: Допустим один пользователь делает запрос - стартует один поток. Потом еще два пользователя - выполнение уже в три потока, тут первый пользователь получил данные, его поток завершается, но еще три новых пользователя запрашивают данные...

Я пока не понимаю, как организовать что-то типа очереди, откуда по мере исполнения одни потоки будут удалятся, другие наоборот добавляться. Может кто подскажет куда копать? Заранее спасибо

 , ,

gwyllum
()

PHP - взаимодействие по API и многопоточность

Форум — Development

Доброго времени суток. Возник такой вопрос - есть задание написать скрипт, который должен залить файл на другой и сайт и получить ответ, общаясь через его API(например, сервис распознавания капч). В зависимости от полученного ответа, скрипт должен выводить определенный текст. В задаче оговорено условие, что решение должно быть серверное и многопоточное. Общий алгоритм следующий: при заливке изображения, генерируется страница, на которой выдается текст вида ОК|ID, где ок - статус, а id - идентификатор запроса, с помощью которого потом можно найти запрос. Далее, можно сделать POST-запрос на другую страницу, указав id запроса и получить текст капчи. На практике все немного сложнее, т.к. есть обработка ошибок, различные параметры и секретный ключ, без которого распознавание попросту не пройдет, но на суть вопроса это не влияет.

Как бы я сделал это в принципе: html-страница, на которой есть форма для загрузки файла. по сабмиту, файл передается с помощью ajax на сайт и возвращается текст, который вернула страница. этот текст, парсится, оттуда берем id и делаем второй запрос, в результате которого получаем распознанный текст.

Но решение должно быть серверным и многопоточным. Если не сложно, подскажите нубу, в каком направлении копать

Написано, что скрипт должен выдерживать нагрузку, допустим, в тысячу человек. Насколько я понимаю, когда человек вызывает php-скрипт, то создается соединение и интерпретатор начинает генерировать на основании скрипта страницу. Если несколько человек одновременно запрашивают страницу, то создается несколько соединений. У каждого юзера своя сессия, свои параметры. Чем же тогда является одновременное исполнение php-скрипта для нескольких пользователей как не многозадачностью?

Помогите пожалуйста разобрать кашу в голове. В общем, пните в нужном направлении. Заранее спасибо

 , , ,

gwyllum
()

Софт для организации музыки. Может кто подскажет.

Форум — Desktop

Доброго времени суток, уважаемые форумчане. Не отношусь к счастливым пользователям, которые закидывают пару тысяч песен в плейлист и не парятся, поэтому задался вопросом организации музыки. Большинство плееров позволяют отфильтровать коллекцию по исполнителю, году, жанру, но как показал опыт, этого недостаточно. Зачастую встают более специфические задачи. Например, зарядка лучше делается под тяжелую музыку, программируется лучше под инструменталки(т.е. песни без слов), когда обдумываешь идеи, вообще мозг воспринимает только эмбиент. До этого пытался разбить по папкам, а-ля programming, sport, web-surfing, sleep и т.п., но часть файлов будет дублироваться в нескольких папках, что не есть хорошо. Плюс сам процесс копирования файла в несколько папок немного геморойный.

В идеале, нужно что-то вроде списка файлов, каждому из которых можно назначить одну или несколько меток - что-то по аналогии с заметками, которым можно несколько тегов присвоить. Причем, процесс должен быть по возможности быстрым. Частично решал проблему в Clementine, открывая редактор тегов и вписывая в поле «комментарий» название метки, потом создавал умный плейлист, находил все треки, в комментарии которых указано название метки и слушал. Но это долго.

Присматривался к GCstar. Создал кастомную коллекцию, у которой есть параметры файл, название, исполнитель, метки. Но в программе можно добавлять по одному файлу через диалог открытия файла. А мне необходимо именно закинуть скопом и уже потом организовать. Если у кого-то будут идеи, как организовать, с удовольствием послушаю.

PS да, я понимаю, что большинству не нужно, но мне нужно.

PS2 проблема частично решается с помощью плейлистов. Но когда я выбираю определенную песню, я не вижу, в каких именно плейлистах она есть и в какие ее нужно добавить.

Заранее огромное спасибо.

 , ,

gwyllum
()

Программирование под Andriod - сохранение данных на сервере

Форум — Development

Доброго времени суток, уважаемые форумчане. Учусь программировать под андроид, встал вопрос - как лучше хранить данные, при условии, что игра рассчитана на >2 человек. Т.е. карты, шахматы и прочие. Необходимо хранить рейтинг и т.п. Отсюда вопрос - как и где их хранить? Арендовать сервер с какой-нибудь СУБД, использовать готовые сервисы? Подскажите пожалуйста, кто сталкивался? Речь не идет о супер-пупер мморпг, так что супербыстрая БД, способная выдержать игру а-ля вов на тысячу человек не нужна. Все что нужно, это возможность сохранять ходы игрока(на тот случай, если приложение вылетело и он вернулся), имя, рейтинг игрока. Буду очень благодарен за советы

 ,

gwyllum
()

Вопрос по FIFO

Форум — Development

Доброго времени суток. С-но вопрос, делаю простейший вывод в FIFO

char fifoName[]="testfifo"; //имя файла FIFO

void write_FIFO()
{

  unlink(fifoName);

  FILE *cfp;

   int ret;

  ret = mknod(fifoName, S_IFIFO | 0600, 0); 


        cfp = fopen(fifoName,"w");
      //if(cfp == NULL) 
      //fprintf(stderr, "ERROR: Ошибка работы с FIFO\n" );

        int value=1000;

      int rt=fprintf(cfp,"%d\n",value);
      printf("write %d from child on fifo \n", value);
      value=2000;
      fprintf(cfp,"%d",value);
      printf("write %d \n", value);
      //fflush(cfp);
      exit(0);

}
void read_FIFO()
{
  FILE *pfp;
        pfp = fopen(fifoName,"r");
      if(pfp == NULL) 
  
  fprintf(stderr, "ERROR:\tОшибка работы с FIFO\n" );

    int result;
    int value;
      while(result=fscanf(pfp,"%d",&value)>0)
      {
          printf("This is the parent. Received value %d from child on fifo \n", value);
      }
      if(result < 0) 
  fprintf(stderr, "ERROR:\t ошибка работы с FIFO\n" );
      fclose(pfp);

}

 
int main()
{    
    pid_t pid, pid2;
   
    pid=fork();

    printf("pid=%d\n", pid);
    switch(pid)
    {
        case 0:

        pid2=fork();
        switch(pid2)
        {
            case 0:
            write_FIFO();
            break;

            default:
            //waitpid(pid2,0,0);
            read_FIFO();
           unlink(fifoName); /* Delete the created fifo */

            break;
        }

        break;

        default:
        waitpid(pid,0,0);
      exit(0);
       break;
    }
   
}

Этот пример работает, проблема начинается, если я пытаюсь раскомментировать строку waitpid(pid2,0,0) - тогда чтение зависает. Дело в том, что в моей программе нужно реализовать ожидание процесса, а как только я делаю это, программа сразу зависает на чтении. Подскажите пожалуйста, почему это происходит и куда копать?

gwyllum
()

Передача данных через семафоры

Форум — Development

Доброго времени суток. Суть проблемы - пишу курсовой на с. Необходимо сделать передачу данных(массив) используя семафоры. Сперва я сделал передачу через pipe, используя семафоры для поочередного доступа к ресурсу. Но преподаватель указал на текст задания, а там написано:

никаких дополнительных средств коммуникации между процессами не использовать, только семафоры.

т.е. FIFO, разделяемую память и т.п. использовать нельзя. Может кто подскажет, как это реализовать?

Заранее огромное спасибо

 

gwyllum
()

c функция добавления в конвеер

Форум — Development

Доброго времени суток! Необходимо реализовать курсач с процессами, которые обмениваются данными через конвеер, FIFO,разделяемую память и прочее. С-но, работа и так объемная и хотелось бы часть кода вынести в функции. В связи с этим задумался о том, как бы сделать функции записи-чтения из pipe. Пока надумал вот что:

void init_pipe()// создаем конвеер
{
	 if(pipe(fd)<0)
    {
      fprintf(stderr, "Ошибка создания конвеера! \n");
      exit(0);
    }
    else
    {
    	fprintf(stderr, "Конвеер успешно создан! \n");
    }
}

void save_pipe(char *info)
{
	close(fd[0]);
	int size = write(fd[1], info, strlen(info));

	close(fd[1]);
}

char* load_pipe()
{
	close(fd[1]);
	char buffer[ELEMENT_SIZE];
	char *temp;
	read(fd[0], buffer, ELEMENT_SIZE);

	strcpy(temp, buffer);

	close(fd[0]);

	return temp;
}

пытаюсь это дело заставить так:

        init_pipe();
	save_pipe("234");

	printf("%s", load_pipe());

Однако мне выдается ошибка сегментирования ядра. Понимаю, что тема скорее всего ламерская, однако раньше никогда не занимался такими вещами и всегда предпочитал высокоуровневые функции. Может кто подскажет, как сделать задуманное, или хотя-бы уменьшить объем кода, чтобы не пришлось каждый раз закрывать файлы, записывать-считывать данные, проверять правильно ли они записаны-считаны через значение, возвращаемое read-write, и т.п.

Буду очень благодарен за помощь

 ,

gwyllum
()

Вопрос по pipe

Форум — Development

Подскажите пожалуйста, можно ли читать и писать в файлы, создаваемые функцией pipe с помощью средств c++? Нашел примеры только для c, т.е. используя функции read и write.

 ,

gwyllum
()

Вопрос по семафорам

Форум — Development

Доброго времени суток. Извиняюсь за ламерский вопрос. Насколько я понял, с помощью семафора можно контролировать доступ к какому-то ресурсу. У меня по заданию есть ветка процессов, первый из которых считывает файлы из директории и передает предпоследнему процессу эти размеры с помощью семафоров. Я слабо разобрался, но по-моему, семафор - это переменная, которую процессы не могут менять одновременно и система гарантирует, что они будут менять ее по очереди. Для меня семафор это что-то вроде переключателя и я слабо представляю, как с его помощью можно передавать массив размеров из одного процесса в другой. Подскажите пожалуйста, что почитать, чтобы лучше вникнуть.

 ,

gwyllum
()

c++ родитель процесса

Форум — Development

Доброго времени суток! Разбираюсь с созданием процессов в с++. Порождаю процесс и вывожу его pid и pid его родителя. Иногда выводит pid основного процесса, а иногда - pid процесса init. Хотел спросить, с чем это связано и что я не так делаю


switch(brown_process)// 
	{
	case -1: //обрабатываем ошибку
	  	cerr << "Ошибка запуска коричневого процесса!"<<endl;
	  	return -1; //завершаем программу
	  	break;

	case 0:
  		cerr<<"Коричневый процесс работает! Его id: "<<getpid()<<endl;
  		cerr<<". id его родителя: "<<getppid()<<endl;

  		exit(0);
  		break;

   	default : 
  		cerr<<"Продолжение работы"<<endl;

  	}

 , ,

gwyllum
()

c++ передать данные в программу

Форум — Development

Доброго времени суток! По заданию мне необходимо передавать данные в мою программу таким образом:

ls -l | ./myproga.out
Пытаюсь вывести то, что получил из ls но код
for (int i = 0; i < argc; i++) cout << "argv[" << i << "] содержит " << argv[i] << endl; 
Выдает только имя программы, тогда как переданные ей данные не выводятся. Что я не так делаю, подскажите пожалуйста. Заранее спасибо.

 ,

gwyllum
()

Ламерский вопрос про ls

Форум — Desktop

Вопрос наверное немного ламерский, но не знаю, как нагуглить. Есть задание курсовой. В рамках его необходимо создать приложение под linux, которое порождает несколько потоков и обменивается данными. Непонятен вот этот момент:

Для верной работы программ Вам необходимо будет запускать их в конвейерах с какими-либо командами ОС (например, для получения на стандартном потоке ввода вашей программы расширенного списка файлов запустите ls -l | ./myproga).

Подскажите, что произойдет если запустить в таком виде? Первая команда выводит список каталогов, дальше идет формат вывода, а дальше?

 , ,

gwyllum
()

Необходимо распознавать приход сообщения skype

Форум — Desktop

Доброго времени суток! С-но проблема такова - работаю дистанционно, иногда работы валом, иногда за сутки приходит 1-2 пятиминутных задания. Естественно, параллельно занимаешься другими делами. Желательно на пришедшие задания реагировать оперативно, но подбегать каждые 5 минут к компьютеру и проверять как-то не хочется. Иногда хочется воспользоваться отсутствием работы и днем по-человечески выспаться. Очень неприятно, проснувшись, узнать что тебя уже пару часов ругают в сообщениях.

Отсюда возник вопрос - как сделать, чтобы компьютер подавал звуковой сигнал, если мне что-то в скайп пришло.

Первая мысль - распознавать пиксел экрана. В списке контактов, когда приходит новое сообщение, высвечивается кружочек с единичкой. Но экран может быть свернут, а окно уехать. Так что этот вариант отпадает.

Вариант с треем не прокатит, т.к. у меня гном, в котором трей вообще скрыт.

Очень интересно было бы послушать идеи, как подобное реализовать. Система Elementary OS. Заранее благодарен.

gwyllum
()

Посоветуйте софт для разработки сайтов

Форум — Development

Доброго времени суток, уважаемые форумчане. Работаю php-программистом. Сейчас использую набор софта, но он не совсем удобен. Прошу совета чем заменить или как научиться его правильно готовить

Для подключения к ftp использую krussader. Проблема в том, что если вкладка с ftp-подключением закрылась, приходится обратно заново вводить логин-пароль-адрес. Нужен либо другой файловый менеджер, либо совет, как упростить работу с крусадером, чтобы не пришлось по 20 раз вводить пароль. В Total Comander подключения сохраняются.

Стандартный редактор крусадеры не удобен, поэтому пробовал sublime text - вещь удобная, но почему-то когда указываю его редактором крусадера, то по F4 он не открывает файл, а показывает пустую вкладку с надписью ftp

Пока не подумываю в сторону IDE, т.к. хочется легкости и компактности, тем более зачастую работа состоит в том, чтобы поправить пару файлов, а не написать свою социальную сеть.

Кто еще что посоветует? Буду очень признателен

 ,

gwyllum
()

Qt - не могу скомпилировать - /usr/bin/ld: cannot find -lGL

Форум — Development

С-но вопрос. При попытке скомпилить любое приложение в Qt-creator выдает вот это:

/usr/bin/ld: cannot find -lGL
collect2: error: ld returned 1 exit status
make: *** [untitled] Error 1
кто сталкивался с похожей проблемой? Заранее спасибо!

Гугление ничем не помогло. А именно: -согласно советам добавил: LIBS += -lGL

QT += opengl

установил драйвера nvidia

 , ,

gwyllum
()

Qt Sqlite драйвер существует, но выдает, что не может загрузить

Форум — Development

Доброго времени суток, с-но проблема:

sqldb=QSqlDatabase();
    QSqlDatabase::addDatabase("QSQLITE");

    sqldb.setDatabaseName("/home/eugenes/dbase.sqlite");
      if (!sqldb.open()) {
          qDebug() << "Error! DataBase not found";
          qDebug()<<sqldb.lastError().text();

          qDebug()<<QSqlDatabase::drivers();
      }

На выходе:

Error! DataBase not found «Driver not loaded Driver not loaded» («QSQLITE», «QMYSQL», «QMYSQL3», «QPSQL», «QPSQL7»)

QSqlDatabase::drivers показывает, что драйвер в системе присутствует. Пробовал грешить на поврежденный файл БД, но он открывается и в менеджере редактируется. Пользуюсь firefox-расширением SQlite manager.

Кто подскажет в чем может быть дело? Qt-creator ставил не из дистрибутива а скачивал онлайн-инсталер с сайта. Заранее спасибо!

 , , ,

gwyllum
()

Qt QML программирование жестов

Форум — Development

Доброго времени суток! Хочется написать небольшую программу для своего ведроида. В связи с этим встал вопрос - использую Qt Quick и мне нужна поддержка жестов.

Нагуглил пока QGestures, но все примеры были для стандартного Qt-шного гуя, Как их использовать в QML - неясно

Нагуглил PinchArea - насколько я понимаю, это элемент, отлавливающий манипуляции с двумя пальцами, а мне нужны пока жесты с одним пальцем, вроде провести слева направо и т.п.

Может есть смысл тыкать в MouseArea и пытаться использовать его?

Буду очень признателен, если тыкнете носом, куда копать. Заранее спасибо.

 , , ,

gwyllum
()

Ubuntu где-то пропал гиг памяти.

Форум — Desktop

С-но вопрос, купил себе планку памяти на 2ГБ, всего стало 4. В биосе показываются 4. Делаю

cat /proc/meminfo
Выдает: MemTotal: 3078472 kB MemFree: 595620 kB

Отсюда вопрос - где еще гигабайт? Грешил на 32-разрядную систему, но в итоге оказалось, что у меня 64-битная.

gwyllum
()

RSS подписка на новые темы