这个非常简单的C程序有什么问题?(导致内存泄漏)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (6)

我在C中有一个非常简单的程序,我用它每秒执行一次对php的系统调用,执行一个php脚本,将数据库中的挂起推送通知发送给Apple。但无论如何,这个程序在大约10个小时后会导致内存溢出,所以我将线程创建之间的休眠时间从1秒减少到10000us,我可以实时看到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, &param);



    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 ;

}

我知道一点C,我记得我需要释放自己只用malloc分配内存。这里我不做这种动态内存分配。那么为什么这个程序会增加内存使用量?

提问于
用户回答回答于

您没有调用pthread_join()也没有使用pthread_detach(),因此不会释放为该线程分配的资源。即每个线程都有自己的堆栈,这可能是导致内存消耗上升的原因。

关于您的实现的一些评论:由于您计划执行PHP脚本system()并且实际上不需要处理共享变量或文件描述符,因此最好使用fork()其中一个变体exec()。这将生成一个新进程,而无需创建线程的中间步骤。也不建议使用system()它,因为它经常允许在输入未正确清理时利用程序。在这种情况下,如果您只手动调用它可能没问题。

扫码关注云+社区

领取腾讯云代金券