LINUX.ORG.RU

Вопрос по потокам (pthread)


0

0

Ситуация такая, у меня запускаются пару потоков.
В потоке у меня вызывается system("blah");
В другом потоке я проверяю акуально ли выполнение этого
потока и принимаю решение килять его или оставить работать.

Но при килянии потока (pthread_cancel(...)) сам поток
убивается а вот то что было и выполнялось в system 
- остается работать.

Как при завершении процесса убить то что я запустил через 
system ???

Ответ на: комментарий от philip

Вот кусок где при подключении клиента я открываю отдельный поток
и в пару записываю дескриптор сокета и потока

if(!listen(sockfd, 5))
	{	
	    n = sizeof(sa);
	    while(1) {
	    
		    if((fd = accept(sockfd, NULL /*(struct sockaddr *) &sa*/, NULL /*&n*/)) != -1)
		    {
		        int n_sock;
					
			pthread_t tid;	
		    
			    if(pthread_create(&tid, NULL, operate, (void *)&fd) != 0)
			    {
		    		cout << "error thread" << endl;
			    }
		    
			m_vPool.push_back(pair<pthread_t, int>(tid, fd));
		    }
		}
	    }
	}

Второй поток который запускается из main сразу после старта прило
жения делает такую нехитрую весч:

pthread_t idt;
pthread_create(&idt,NULL,pool,(void*)&m_vPool);

void* pool(void* ps )
{
    vector<pair<pthread_t,int> >* vPool = (vector<pair<pthread_t,int> >*) ps;
    struct sockaddr addr_name;
    socklen_t addr_len;
    addr_len = sizeof(addr_name); 
    
    
    while(1)
    {
	for(int i = 0; i < (int)vPool->size(); i++)
	{
	    bzero(&addr_name,sizeof(addr_name));
	    int nRes = getpeername((*vPool)[i].second,&addr_name,&addr_len);

	    
	    if(nRes == -1)
	    {
		shutdown((*vPool)[i].second,2);
		close((*vPool)[i].second);
		pthread_cancel((*vPool)[i].first);
		vPool->erase(vPool->begin() + i);
		i--;
	    }
    	}
	sleep(5);	
    }
    
    return NULL;
}

Fastman
() автор топика
Ответ на: комментарий от philip

Немножко не ту версю показал, но се тоже самое,
плюс:
If successful, the pthread_cancel() function shall return zero; otherwise, an error number shall be returned to indicate the error.  

т.е введена проверка на результат выполнения pthread_cancel()

Fastman
() автор топика
Ответ на: комментарий от MKuznetsov

Про pthread_cleanup_push можно попобробнее ???
Как это сделать применимо к моему коду ?

Fastman
() автор топика

system делает fork, т.е. получается новый процесс. Убить, соответственно, kill'ом.

anonymous
()
Ответ на: комментарий от anonymous

как получить PID который сделал system ?? (systrm пока выполняется держит ф-цию)

Fastman
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.