守护程序无法正常工作的原因

时间:2014-06-18 02:22:42

标签: c daemon

守护进程无法工作的主要原因是什么?比如,我和#34;允许的是什么?放入无限循环?因为我有这样的无限循环:

/* The Big Loop */
    while (1) {
       readname(dirSource, dirDest, list1, list2);
       sleep(1); /* wait 30 seconds */
    }

它只运行一次,但就是这样。

这是我的readname方法:

void readname(DIR* dirSource, DIR* dirDest, char *list1[], char *list2[]){
sizeSource=0;
sizeDest=0;
syslog(LOG_INFO, "Start saving names of files and directories.\n");
/* save all the names of the files and directories within directory */
while ((ent = readdir (dirSource)) != NULL) {
    if(strcmp(".",ent->d_name)==0 || strcmp("..",ent->d_name)==0){
    }else{

        list1[sizeSource] = strdup(ent->d_name);       
        sizeSource++;
        if(sizeSource>=nE){break;}
    }
}
closedir(dirSource);
syslog(LOG_INFO, "Finished saving names from source directory.\n");
while((ent1 = readdir (dirDest)) != NULL) {
    if(strcmp(".",ent1->d_name)==0 || strcmp("..",ent1->d_name)==0){
    }else{
        list2[sizeDest] = strdup(ent1->d_name);
        sizeDest++;
        if(sizeDest>=nE){break;}
    }
}
closedir(dirDest);
syslog(LOG_INFO, "Finished saving names from destination directory.\n");
syslog(LOG_INFO, "Finished saving all names.\n");
mkdir("/home/ubuntu/Desktop/Test", 0700);

}

如果方法只有mkdir行,它可以正常工作,它会停留在无限循环中。但是当我添加剩下的代码时,它只执行一次。怎么了?

2 个答案:

答案 0 :(得分:1)

我忘了打开DirSource和DirDest

答案 1 :(得分:0)

您没有显示释放使用strdup()分配的所有内存的位置。因为泄漏而耗尽内存是守护进程在一段时间后失败的主要原因。但是,它需要相当大的目录才能使您在第一个循环中失败。

在一个守护进程中,你几乎可以在非守护进程中做任何事情,但通常你会想做的事情。您不会与用户进行互动。标准输入可能是/dev/null;您的代码需要从其他地方读取。您需要考虑您的守护程序是否将以标准输出运行,并且标准错误是否连接到某种日志文件。

守护程序因其他程序失败的类似原因而失败。他们不检查错误情况。他们试图做不允许的事情。他们比交互式程序更容易出现内存耗尽,因为它们运行时间很长 - 但这不仅仅是守护进程的特权。