工具与软件:
我遇到了一个问题。 我调用了系统接口、以创建计时器。 我发现、每次进入计时器时、内存都会增加4K。 下面是我的测试记录:
前提条件:相同的代码。
1.在 Linux 下,线程模式或信号模式都不存在内存泄漏。
2.在 tda4 QNX 下,使用信号时没有内存泄漏,但使用线程时有内存泄漏。
3.我也尝试过其他硬件 QNX ,没有内存泄漏。
因此、我怀疑 TDA4 QNX 可能有问题。 以下是我的源代码、可以将其编译到 bin 中并运行以查看有效效果。
./a.out 线程或 ./a.out 信号
AS_STATS.rss=0x7B (492.000kB)
-------------------------------------------------------
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void show_mem()
{
pid_t pid = getpid();
字符 buff[50]={0};
snprintf (buff、sizeof (buff)、"cat /proc/%d/vmstat | grep as_stats.rss"、pid);
系统(缓存);
}
void * timer_thread_handler (联合 sigval SV){
pthread_date(pthread_self());
printf ("Thread 计时器已过期! 线程 ID:%lu\n"、(unsigned long)pthread_self();
show_mem();
pthread_exit (NULL);
返回 NULL;
}
int create_timer_thread (timer_t * timerid、int interval_ms){
结构 sigevent sev;
结构 itimerspec ITS;
SEV.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = timer_thread_handler;
SEV.sigev_notify_attributes = NULL;
sev.sigev_value.sival_ptr = timerid;
if (timer_create (clock_REALTIME、&sev、timerid)==-1){
perror ("timer_create");
返回-1;
}
its.it_value.tv_sec = interval_ms/1000;
its.it_value.tv_nsec =(interval_ms % 1000)* 1000000;
its.it_interval.tv_sec = interval_ms/1000;
its.it_interval.tv_nsec =(interval_ms % 1000)* 1000000;
if (timer_settime(*timerid, 0,&its, NULL)==-1){
perror ("timer_settime");
返回-1;
}
返回0;
}
int thread_main()
{
timer_t timerid;
if (create_timer_thread (&timerid,1000)==-1){
fprintf (stderr、"Failed to create timer\n");
EXIT (EXIT_FAILURE);
}
printf ("计时器已启动、等待计时器事件...\n");
while (1);
}
timer_t timer_id;
void timer_handler_signal (int signo、siginfo_t *信息、void *上下文){
if (signo == SIGALRM){
printf ("信号计时器过期! 线程 ID:%lu\n"、(unsigned long)pthread_self();
show_mem();
}
}
int create_timer_signal (int initial_sec、int interval_sec、int user_data){
结构 sigevent sev;
结构 itimerspec ITS;
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler_signal;
sigemptyset (&sa.sa_mask);
if (sigaction (SIGALRM、&sa、NULL)==-1){
perror ("sigaction");
返回-1;
}
SEV.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGALRM;
sev.sigev_value.sival_int = user_data;
if (timer_create (clock_REALTIME、&sev、&timer_id)==-1){
perror ("timer_create");
返回-1;
}
its.it_value.tv_sec = initial_sec;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = interval_sec;
its.it_interval.tv_nsec = 0;
if (timer_settime (timer_id、0、&ITS、NULL)==-1){
perror ("timer_settime");
返回-1;
}
返回0;
}
int signal_main(){
int USER_DATA = 42;
如果(CREATE_TIMER_SIGNAL (1、1、USER_DATA)=1){
fprintf (stderr、"Failed to create timer\n");
返回 EXIT_FAILURE;
}
while (1){
pause();
}
timer_delete (timer_id);
返回 exit_Success;
}
int main (int argc、char * argv[])
{
if (strcmp ("thread"、argv[1])=0){
thread_main();
}其他{
signal_main();
}
返回0;
}
