守护进程无法工作的主要原因是什么?比如,我和#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
行,它可以正常工作,它会停留在无限循环中。但是当我添加剩下的代码时,它只执行一次。怎么了?
答案 0 :(得分:1)
我忘了打开DirSource和DirDest
答案 1 :(得分:0)
您没有显示释放使用strdup()
分配的所有内存的位置。因为泄漏而耗尽内存是守护进程在一段时间后失败的主要原因。但是,它需要相当大的目录才能使您在第一个循环中失败。
在一个守护进程中,你几乎可以在非守护进程中做任何事情,但通常你会想做的事情。您不会与用户进行互动。标准输入可能是/dev/null
;您的代码需要从其他地方读取。您需要考虑您的守护程序是否将以标准输出运行,并且标准错误是否连接到某种日志文件。
守护程序因其他程序失败的类似原因而失败。他们不检查错误情况。他们试图做不允许的事情。他们比交互式程序更容易出现内存耗尽,因为它们运行时间很长 - 但这不仅仅是守护进程的特权。