LINUX.ORG.RU

Сообщения antp

 

Утечка памяти после detached потока

Форум — Development

Здравствуйте.

Столкнулся с такой вот проблемой. Необходимо запускать однотипные потоки, следить за ними не надо - сделали своё дело - и пока. Для этого, как известно, используются потоки с атрибутом detached. Однако, когда я создаю такие потоки - после завершения каждого из них - стек не очищается, остается выделенным 1024k в моём случае (Centos 6.6). Даже после уничтожения 1-го потока он прибавляется на 65404к.

Всё что нашёл по этому поводу как раз связано с тем, что используются не detached потоки, либо используются для создания потоков vector и пишется, что якобы это связано с ними.

Но я упростил пример, всё просто - и всё равно память утекает.

Что можете подсказать?

 ,

antp
()

как работает select на unnamed pipe?

Форум — Development

Здравствуйте!

Разбираюсь с тем, как сделать передачу данных между основным процессом и потомком(потоком). Создаю в процессе pipe, потом создаю потомка (по-идее теперь pipe принадлежит обоим), а так, как он закольцован, то запись в потомке ведёт к появлению данных в родителе, которую я хочу отловить по select.

Внизу пример. Но select не срабатывает почему-то. Просто завершается по таймеру.

Можете подсказать как тут быть?

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <signal.h>
#include <sys/wait.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/syscall.h>
#include <linux/unistd.h>
#include <fcntl.h>

using namespace std;
//Дескрипторы pipa
int client_pipe[2];

//Код потока
void * thr_loop(void * arg)
{
int i = 0;
	char wbuf[1024];
	while(1)
	{
	char num[33];
		strcpy(wbuf,"test ");
		sprintf(num,"%d",++i);
		strcat(wbuf,num);
		//Пишем в дескриптор для записи раз в секудну
		write(client_pipe[1],wbuf,10);
		sleep(1);
	}
	pthread_exit((void * )0);
}


int main(int argc,char*argv[])
{

	pipe(client_pipe);
	
	fd_set pipes_set;
    FD_ZERO(&pipes_set);
	
	int max_pipe_num = 0;
	//Нашли максимальный pipe
	if (client_pipe[0] > max_pipe_num)	max_pipe_num = client_pipe[0];
	if (client_pipe[1] > max_pipe_num)	max_pipe_num = client_pipe[1];	

	//Старт потомка
	pthread_t _thread;
	pthread_create(&_thread, NULL, thr_loop, NULL);
	while(1)
    {
			struct timeval tv;
			const int n = 1024;
			char chprbuf[n];
			int chprbuf_len = 0;
			memset(&chprbuf,0,sizeof(chprbuf));
			tv.tv_sec = 1;
			tv.tv_usec = 0;
			//Ждём данные от потомка
			if(select(max_pipe_num + 1, &pipes_set, NULL, NULL, &tv) > 0)
			{
				chprbuf_len = read(client_pipe[0],chprbuf,n);
				if(chprbuf_len>0){
					string msg = string(chprbuf);
					cout<<msg<<endl;
				}
			}
    }
	pthread_join(_thread, NULL);
    exit(0);
}

 ,

antp
()

Как узнать размер открытого и дозаписываемого файла?

Форум — General

Добрый день!

Если файл открыт на запись, то ни ls, ни lsof не показывают его изменившийся размер, а показывают старый. Новый размер показывается только когда файл будет закрыт.

Как можно посмотреть размер файла «онлайн»?

 ,

antp
()

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