LINUX.ORG.RU

Сообщения salik

 

параметр загрузки ядра 2.6.30-gentoo

Нужно вывод ядра при загрузке посмотреть пошагово. Подскажите параметр загрузки ядра? Или комбинацию клавиш. То, что нашел ctrl-Q ctrl-C l scrlock - не работают. Спасибо.

 , ,

salik
()

c,stdout,начинающий

Здравствуй, ЛОР!

Ткните носом. Осваиваю Си. Застрял в одном месте.

В программе стандартныe вывода (stdout и stderr) одной консольной программы через каналы (pipe) завел в основную программу. Файловые дескрипторы каналов преобразовал в поток даных (FILE*), чтобы обрабатывать их стандартной библиотекой си. События о том, что в каналах появились новые данные обрабатываю в epoll().

Вот кусок кода.

	while (1) {	
		nr_events = epoll_wait (epfd, events, 64, -1);
		
		if (nr_events<0) {
			perror ("epoll_wait:");
			free (events);
			exit(EXIT_FAILURE);
		}
		
		
		if (nr_events >0) {			
			for (n = 0; n < nr_events; ++n) {
			
				int i =0;
				if (events [n].data.fd == 3) {	
					while ((sym = fgetc (stream_info)) != '\n') {			
						buff[i++] = sym;
					}								
					buff[i]   = '\0';
					printf ("STDOUT - %s \n", buff);										
				}
			
				int k = 0;
				if (events [n].data.fd == 5) {							
					while ((sym = fgetc (stream_err)) != '\n') {							
						buff_err[k++] = sym;							
					}							
					buff_err[k]   = '\0';
					printf ("STDERR - %s \n", buff_err);					
				}					
			}			
		}
	}

В принципе код рабочий, но, если только принимается одна строка. Если в выводе за одно событие больше 2-х строк, вижу только первую. Остаток прочитается при следующем событии. По коду ясно почему так. Не понятно как правильно определить, что в потоке больше нет данных? И как правильно парсить стандартные потоки?

 , ,

salik
()

ожидание событий в main() от потоков (threads) (нуб)

Добрый день, ЛОР. Вопрос нубский. Но, для меня, пока неясен.

Что имеем: main() и 4 потока (threads) Потоки опрашивают из своих fd и передают в свои fd данные. Здесь используем epoll(). Тут понятно.

Данные от потоков и в потоки передаются в main() через глобальные переменные.Для факта наличия новых данных используются флаги. И все это в while(1). Вот этот момент и не нравится.

Ткните носом, как это правильно можно реализовать? Можно ли использовать epoll() в main() (получается создав fd между потоками и main?)? Граммотно ли это?

 , ,

salik
()

переменая си

Не могу понять, куда копать. Имеется следующий код (это часть, выделил только то, что имеет отношение к вопросу с отладочной печатью):

void httpClientReqBuf (char *url, unsigned char **buff);

char *URL1 = "http://192.168.0.10:9999/json_discret1";
char *URL2 = "http://192.168.0.10:9999/json_discret2";

unsigned char *buff1;
unsigned char *buff2;

while (1)
{
    httpClientReqBuf (URL1, &buff1);
    printf ("buff1 %s\n", buff1);        // здесь печать buff1 проходит нормально
		
    httpClientReqBuf (URL2, &buff2);     
    printf ("buff2 %s\n", buff2);
    
    printf ("buff1 %s\n", buff1);       // здесь печать buff1 не верна
    printf ("buff2 %s\n", buff2);
}

вывод

buff1 {"DI_tag1":"1","DI_tag2":"0"}
buff2 {"DI_tag3":"0","DI_tag4":"1"}
buff1 �
buff2 {"DI_tag3":"0","DI_tag4":"1"}

buff1 {"DI_tag1":"1","DI_tag2":"0"}
buff2 {"DI_tag3":"0","DI_tag4":"1"}
buff1 {"DI_tag3":"0","DI_tag4":"1"}
buff2 {"DI_tag3":"0","DI_tag4":"1"}

buff1 {"DI_tag1":"1","DI_tag2":"0"}
buff2 {"DI_tag3":"0","DI_tag4":"1"}
buff1 {"DI_tag3":"0","DI_tag4":"1"}
buff2 {"DI_tag3":"0","DI_tag4":"1"}

Значение строки buff1 сразу за вызовом функции httpClientReqBuf (URL1, &buff1) верно, что и вижу при отладочной печати. Но после вызова функции httpClientReqBuf (URL2, &buff2) значение buff1 меняет свое значение и в разные запросы принимает всякий мусор, может принять и значение buff2. Объясните пожалуйста почему так происходит, почему затирается значение buff1 в памяти? Как мне это правильно реализовать ?

 ,

salik
()

подскажите по libevent

Братцы ткните носом. Разбираюсь с сервером evhttp из библиотеки libevent. Не могу найти пару функций в этой библиотеке:

1. определение IP адреса клиента

2. парсер строки GET запроса ( значение пар name и value)

Спасибо.

 , ,

salik
()

функция system(), перенаправление вывода

Здравствуйте братцы! Ткните носом) Пишу программу на Си. Мне нужно получить данные о новых письмах с сервера GMAIL. Библиотеку парсера пока не освоил, но есть рабочая команда для bash:

curl -u user:password --silent "https://mail.google.com/mail/feed/atom" | awk -F '<fullcount>|</fullcount>' '{print $2}'
Работает. Выдает количество писем не прочтенных. Хочется прикрутить выхлоп этой команды через вызов фунции system()
system "curl -u user:password --silent "https://mail.google.com/mail/feed/atom" | awk -F '<fullcount>|</fullcount>' '{print $2}'";
в свою программу на Си. Как правильно это сделать?

salik
()

libxml2 подскажите пример кода Си

Братцы подскажите пожалуйста. Разбираюсь с парсером libxml2. Застрял на одном вопросе. А именно как функции xmlReadFile скормить URL? Если можно кусок кода на Си. Прототип у не такой xmlReadFile (const char * filename, const char * encoding, int options). Если передаю имя файла xml - работает, если даю URL с xml - вылетает с ошибкой «I/O warning : failed to load external entity». Спасибо.

 , ,

salik
()

SCHED_RR изменение временного интервала

Подскажите пожалуйста. Только начал изучать планирование процессов и sched_setscheduler. Сейчас заткнулся на политике SCHED_RR. Не могу изменить временной интервал для процессов.

Код такой, компилится без ошибок, а значения временного интервала sched_rr_get_interval(0, &ts) не изменяются.

int main(){
	
  struct sched_param param;
  struct timespec ts;											
  
  param.sched_priority = 99;								
 
  /* Необходим максимальный интервал времени */
  
  nice(-20);													
  if (sched_setscheduler(0, SCHED_RR, &param) == -1) {			
    perror("sched_setscheduler failed\n");
    return 3;
	}
  sched_rr_get_interval(0, &ts);
  printf ("max timeslice = %ld msec\n", ts.tv_nsec/1000000);
  
  /* выводит -> max timeslice = 199 msec */
 
  /* Необходим минимальный интервал времени. Обратите также
   * внимание, что аргументом для nice является "приращение",
   * а не абсолютное значение. Таким образом, выполнение
   * nice(39) приводит к работе с приоритетом nice +19
   */
   
  nice(39);
  if (sched_setscheduler(0, SCHED_RR, &param) == -1) {			
    perror("sched_setscheduler failed\n");
    return 3;
	}
  sched_rr_get_interval(0, &ts);
  printf ("min timeslice = %ld msec\n", ts.tv_nsec/1000000);
  
  /* output -> min timeslice = 9 msec */
 
  return 1;
}

Взято отсюда http://dmilvdv.narod.ru/Translate/ELSDD/elsdd_process_scheduling.html

работаю с Debian 7

 

salik
()

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