C程序导致内存泄漏?
C program causes memory leak?
我使用那个非常简单的 C 程序每秒执行对 php 的系统调用,以便 运行 一个 php 脚本将我的数据库中的待处理推送通知发送到APNS(Apple 通知服务)。
无论如何,这个程序在大约 10 小时后导致内存溢出,所以我将线程创建之间的休眠时间从 1 秒减少到 10000 微秒,并且我可以实时看到 htop
内存在增加而不会从不降低。这是程序:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
typedef struct {
char* script_path ;
} arg_for_script ;
static void *start_instance(void *_args)
{
int id = abs(pthread_self());
arg_for_script* args = _args ;
printf("[SERVICE] start php script on thread %d\n",id);
fflush(stdout);
char cmd[200] ;
sprintf(cmd, "php -f %s %d", args->script_path, id );
system(cmd);
printf("[SERVICE] end of script on thread %d\n", id);
fflush(stdout);
pthread_exit(NULL);
}
int main(int argc, char* argv[])
{
if(argc < 2)
{
fprintf(stderr, "[SERVICE] Path of php notification script must be filled\n");
fflush(stderr);
return EXIT_FAILURE;
}
arg_for_script args ;
args.script_path = argv[1];
pthread_attr_t tattr ;
struct sched_param param;
param.sched_priority = 1 ;
pthread_attr_init(&tattr);
pthread_attr_setinheritsched(&tattr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&tattr, SCHED_FIFO);
pthread_attr_setschedparam(&tattr, ¶m);
while(1) {
pthread_t thrd;
// if(pthread_create(&thrd, &tattr, start_instance, (void *)&args) == -1) {
if(pthread_create(&thrd, NULL, start_instance, (void *)&args) == -1)
{
fprintf(stderr, "[SERVICE] Unable to create thread\n");
fflush(stderr);
return EXIT_FAILURE;
}
usleep( 10000);
}
// pthread_attr_destroy(&tattr);
return EXIT_SUCCESS ;
}
在这里,我没有使用 malloc
动态分配任何 RAM。为什么这个程序会增加内存使用量?我应该在这里 free
什么指针?
您没有调用 pthread_join()
nor use pthread_detach()
,因此分配给线程的资源没有释放。即每个线程都有自己的堆栈,这可能是导致内存消耗增加的原因。
关于您的实施的一些评论:由于您计划使用 system()
执行 PHP 脚本并且实际上不需要处理共享变量或文件描述符,因此最好使用 fork()
和 exec()
的变体之一。这将产生一个新进程,而无需创建线程的中间步骤。也不建议使用 system()
,因为它通常允许在输入未正确清理时利用该程序。在这种情况下,如果您只手动调用它可能没问题。
我使用那个非常简单的 C 程序每秒执行对 php 的系统调用,以便 运行 一个 php 脚本将我的数据库中的待处理推送通知发送到APNS(Apple 通知服务)。
无论如何,这个程序在大约 10 小时后导致内存溢出,所以我将线程创建之间的休眠时间从 1 秒减少到 10000 微秒,并且我可以实时看到 htop
内存在增加而不会从不降低。这是程序:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
typedef struct {
char* script_path ;
} arg_for_script ;
static void *start_instance(void *_args)
{
int id = abs(pthread_self());
arg_for_script* args = _args ;
printf("[SERVICE] start php script on thread %d\n",id);
fflush(stdout);
char cmd[200] ;
sprintf(cmd, "php -f %s %d", args->script_path, id );
system(cmd);
printf("[SERVICE] end of script on thread %d\n", id);
fflush(stdout);
pthread_exit(NULL);
}
int main(int argc, char* argv[])
{
if(argc < 2)
{
fprintf(stderr, "[SERVICE] Path of php notification script must be filled\n");
fflush(stderr);
return EXIT_FAILURE;
}
arg_for_script args ;
args.script_path = argv[1];
pthread_attr_t tattr ;
struct sched_param param;
param.sched_priority = 1 ;
pthread_attr_init(&tattr);
pthread_attr_setinheritsched(&tattr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_setschedpolicy(&tattr, SCHED_FIFO);
pthread_attr_setschedparam(&tattr, ¶m);
while(1) {
pthread_t thrd;
// if(pthread_create(&thrd, &tattr, start_instance, (void *)&args) == -1) {
if(pthread_create(&thrd, NULL, start_instance, (void *)&args) == -1)
{
fprintf(stderr, "[SERVICE] Unable to create thread\n");
fflush(stderr);
return EXIT_FAILURE;
}
usleep( 10000);
}
// pthread_attr_destroy(&tattr);
return EXIT_SUCCESS ;
}
在这里,我没有使用 malloc
动态分配任何 RAM。为什么这个程序会增加内存使用量?我应该在这里 free
什么指针?
您没有调用 pthread_join()
nor use pthread_detach()
,因此分配给线程的资源没有释放。即每个线程都有自己的堆栈,这可能是导致内存消耗增加的原因。
关于您的实施的一些评论:由于您计划使用 system()
执行 PHP 脚本并且实际上不需要处理共享变量或文件描述符,因此最好使用 fork()
和 exec()
的变体之一。这将产生一个新进程,而无需创建线程的中间步骤。也不建议使用 system()
,因为它通常允许在输入未正确清理时利用该程序。在这种情况下,如果您只手动调用它可能没问题。