Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 守护进程不工作的原因_C_Daemon - Fatal编程技术网

C 守护进程不工作的原因

C 守护进程不工作的原因,c,daemon,C,Daemon,守护进程不工作的主要原因是什么?比如,我“允许”在无限循环中放什么?因为我的无限循环是这样的: /* The Big Loop */ while (1) { readname(dirSource, dirDest, list1, list2); sleep(1); /* wait 30 seconds */ } 它只运行一次,但仅此而已 这是我的readname方法: void readname(DIR* dirSource, DIR* dirDes

守护进程不工作的主要原因是什么?比如,我“允许”在无限循环中放什么?因为我的无限循环是这样的:

/* 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
行,那么它工作得很好,它停留在无限循环中。但是当我添加其余的代码时,它只执行一次。怎么了?

我忘了打开DirSource和DirDest

您没有显示在哪里释放了分配给
strdup()的所有内存。由于泄漏而导致内存不足是守护进程在一段时间后失败的主要原因。但是,需要相当大的目录才能使您在第一个周期中失败

在守护进程内,您可以在非守护进程内执行几乎所有您可以执行的操作,但通常会有一些您不想执行的操作。您将不会与用户交互。标准输入很可能是
/dev/null
;您的代码需要从其他地方读取。您需要考虑是否将守护进程与标准输出一起运行,并将标准错误连接到某个日志文件。
守护进程失败的原因与其他程序失败的原因类似。他们不检查错误条件。他们试图做一些不被允许的事情。它们比交互式程序更容易内存耗尽,因为它们运行时间长-但这不仅仅是守护进程的特权。

您已经验证它完成了
readname
的所有完整版本,但只完成了一次?另请参阅。