Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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/unix中杀死信号处理程序中的子进程并派生新进程的守护进程_C_Unix_Daemon - Fatal编程技术网

在c/unix中杀死信号处理程序中的子进程并派生新进程的守护进程

在c/unix中杀死信号处理程序中的子进程并派生新进程的守护进程,c,unix,daemon,C,Unix,Daemon,我已经创建了一个程序,它创建了一个守护进程,在接收到信号后,守护进程会产生并终止一个子进程(“mole”)。当我向进程发送信号(kill-usr1589)时,它也会杀死守护进程。。。它似乎也没有执行我创建的mole程序(记录mole弹出的内容的程序)。我做错了什么?请帮忙 #define MAXMOLES 2 //pid_t moles [MAXMOLES] = {-1,-1}; pid_t pid_child_mole; int num; void handler(int signum){

我已经创建了一个程序,它创建了一个守护进程,在接收到信号后,守护进程会产生并终止一个子进程(“mole”)。当我向进程发送信号(kill-usr1589)时,它也会杀死守护进程。。。它似乎也没有执行我创建的mole程序(记录mole弹出的内容的程序)。我做错了什么?请帮忙

#define MAXMOLES 2
//pid_t moles [MAXMOLES] = {-1,-1};
pid_t pid_child_mole;
int num;

void handler(int signum){
//signal handler that kills child and forks a new one OR kills child
    //and shuts down daemon
    if (signum == SIGTERM){
        kill (pid_child_mole,SIGTERM);
        exit(0);
    }
    if(signum == SIGUSR1){
        if(num == 0 && pid_child_mole > 0){
            kill(pid_child_mole,SIGCHLD);
        }
        num = rand() % 2;
        char *snum;
        sprintf(snum,"%d",num+1);
        char *mArgv[MAXMOLES] = {"mole",snum};
        pid_child_mole=fork();
            if(pid_child_mole==0){
                execv(mArgv[0],mArgv);
            }
        (void) signal(SIGUSR1, handler);
    }//if sigusr1
    if(signum == SIGUSR2){
        if(num == 1){
            kill(pid_child_mole,SIGCHLD);
        }
        num = rand() % 2;
        char *snum;
        sprintf(snum,"%d",num+1);
        char *mArgv[MAXMOLES] = {"mole",snum};
        pid_child_mole=fork();
            if(pid_child_mole==0){
                execv(mArgv[0],mArgv);
            }
        (void) signal(SIGUSR2, handler);
    }//if sigusr2
}
int main(int argc, char* argv[]){
    int fd0, fd1, fd2;
    pid_t process_id = 0;
    pid_t sid = 0;
// Create child process
    process_id = fork();
    if (process_id < 0) {// Indication of fork() failure
        printf("fork failed!\n");
        exit(1);// Return failure in exit status
    }
// PARENT PROCESS. Need to kill it.
    if (process_id > 0){
        printf("process_id of child process %d \n", process_id);
    // return success in exit status
        exit(0);
    }
//unmask the file mode
    umask(0);
    //set new session
    sid = setsid();
    if(sid < 0){
        // Return failure
        exit(1);
    }
// Change the current working directory to root.
    chdir("/");
// Close stdin. stdout and stderr
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
// Open a log file in write mode.
    //fp = fopen ("Log.txt", "w+");
    fd0 = open("/dev/null", O_RDWR);
    fd1 = dup(0);
    fd2 = dup(0);
    (void) signal(SIGTERM, handler);
    (void) signal(SIGUSR1, handler);
    (void) signal(SIGUSR2, handler);
    //num = rand() % 2;
    pid_child_mole=fork();
    while (1)
    {
        //Dont block context switches, let the process sleep for some time
        sleep(1);
    // Implement and call some function that does core work for this daemon.
        if(pid_child_mole == 0) {
            /* This is done by the child process. */
            num = rand() % 2;
            char *snum;
            sprintf(snum,"%d",num+1);
            char *mArgv[MAXMOLES] = {"mole",snum};
            execv(mArgv[0],mArgv );
            /* If execv returns, it must have failed. */
            printf("Unknown command\n");
            exit(0);
          }

    }
    //fclose(fp);
    close(fd0);
    close(fd1);
    close(fd2);
    return (0);
}
修改处理程序&处理程序调用的函数:

void handler(int signum){
//signal handler that kills child and forks a new one OR kills child
    //and shuts down daemon
    if (signum == SIGTERM){
        kill (process_id,SIGTERM);
        exit(0);
    }
    if(signum == SIGUSR1)
        processSigNum(signum,0);
    else if (signum == SIGUSR2)
        processSigNum(signum,1);
    (void) signal(signum, handler);
}

void processSigNum (int sig, int moleNum){
    static int count =0;
    printf("\nThis is moleNum: %d with PID %d", moleNum+1,pid_child_mole[moleNum]);
    if(pid_child_mole[moleNum]>0){
        kill(pid_child_mole[moleNum],SIGKILL);
        pid_child_mole[moleNum] = 0;
    }
    int num = rand() % 2;//new moleNumber
    printf("\nNEW moleNum: %d", num+1);
    char snum[2];//used to store num as a char* and increment so that is it is
                //mole 1 or 2 instead of 0 or 1
    sprintf(snum,"%d",num+1);
    char *mArgv[] = {"mole",snum,0};
    if (pid_child_mole[num] >0)
        printf("\nMOLE %d ALREADY EXISTS!!",num);
    else{
        pid_child_mole[num]=fork();
        count++;
        if(pid_child_mole[num]==0)
            execv(mArgv[0],mArgv);

    }
    printf("\n\n");
}
即使在我从命令行终止子进程时,进程仍会继续,但命令名会从“mole 2”更改为“(mole)”:

718??0:00.01./d 719??0:00.00(摩尔)
725??7:48.36摩尔2

您的
execv()
代码有问题:

char *mArgv[MAXMOLES] = {"mole",snum};
execv(mArgv[0],mArgv );
参数列表需要以空指针终止:

char *mArgv[] = { "mole", snum, 0 };
execv(mArgv[0], mArgv);
此外,在处理程序代码(以及主程序)中,您有:

char *snum;
sprintf(snum,"%d",num+1);
这是致命的;您需要为
snum
分配空间。在这种情况下,修复非常简单:

char snum[16];
sprintf(snum, "%d", num+1);
您可以使用:

char snum[16];
snprintf(snum, sizeof(snum), "%d", num+1);
但这似乎没什么必要

另一对相关问题是:

  • 由于您将
    cd
    复制到根目录,因此除非在根目录中创建
    mole
    程序,否则将无法执行该程序,这将是一件令人讨厌的事情
  • 因为您将
    cd
    写入根目录(如果它运行过的话),
    mole
    程序将尝试在根目录中创建它的日志文件,但是它应该不能写入根目录中的文件
  • 您不应该以用户
    root
    的身份运行测试代码,也不应该以
    root
    的身份开发测试代码。这太危险了

    我注意到,虽然可以将一个经过修饰的、生产就绪的守护进程放到后台,而没有日志文件、标准输出和连接到
    /dev/null
    的标准错误,但这使得调试非常困难。由于几乎没有程序是没有bug的,因此基本上应该始终将守护程序与标准输出和标准错误连接到日志文件(以追加模式打开,这样如果截断日志文件,写入操作仍将发生在现在截断的文件的末尾)。对于守护进程,您可能应该记录每条消息的时间,也可能记录PID。可以使用一个标准的函数日志记录包来实现自动化。如果没有日志文件,您就无法可靠地报告问题,因此您正在盲目运行,盲目运行会导致您绊倒并受伤

    我不确定这些是唯一的问题,但它们可能足以解释你的大部分问题


    修订的
    mole.c
    此版本使用原始信号处理代码、疣和所有缺陷。理论上,它不应该做它在信号处理程序中做的所有事情,但它可以“正常”工作。OTOH,如果出了什么问题,除了重写代码外别无选择

    代码使用我的
    “stderr.h”
    头并隐式地使用实现
    stderr.c
    。这从根本上简化了此处的错误报告编码:
    err\u syserr()
    根据
    errno
    报告错误和系统错误消息并退出,而
    err\u remark()
    写入消息并返回调用代码。
    err_setarg0()
    函数记录程序名(通常基于
    argv[0]
    err\u getlogopts()
    报告当前的日志选项设置,并且
    err\u setlogopts()
    设置相同的值加上
    err\u PID
    (记录每行输出的PID)和
    err\u STAMP
    (给每行输出加上时间戳)。标题为150行(93个非空白、非注释行);源代码是608行(424行非空白、非注释行)-太大,无法在此处显示。如果需要代码,请查看我的个人资料

    命令序列示例 样本
    mole.log
    样本
    moletrap.log
    “(24)坏地址”错误是因为我只修复了使用
    execv()
    的三个位置中的两个;修正第三个问题消除了错误。您可以看到错误处理的发展;第一组没有识别出哪个“执行失败”消息引起了问题;第二组显示“执行失败(2)”,这使得看到问题变得微不足道。观察和学习

    使用“睡梦者醒着,敬礼…”是一个(糟糕的)笑话和一种混淆;它只显示循环随时间推移的迭代。(见维基百科和。)


    这显示了您的代码在工作。我不相信SIGCHLD信号有任何关联,但我把它们留在了里面。不管怎么说,孩子们很快就死了,而不是因为被送去了医院。我没有检查僵尸-当心睡死人。

    您的
    execv()有问题。
    代码:

    char *mArgv[MAXMOLES] = {"mole",snum};
    execv(mArgv[0],mArgv );
    
    参数列表需要以空指针终止:

    char *mArgv[] = { "mole", snum, 0 };
    execv(mArgv[0], mArgv);
    
    此外,在处理程序代码(以及主程序)中,您有:

    char *snum;
    sprintf(snum,"%d",num+1);
    
    这是致命的;您需要为
    snum
    分配空间。在这种情况下,修复非常简单:

    char snum[16];
    sprintf(snum, "%d", num+1);
    
    您可以使用:

    char snum[16];
    snprintf(snum, sizeof(snum), "%d", num+1);
    
    但这似乎没什么必要

    另一对相关问题是:

  • 由于您将
    cd
    复制到根目录,因此除非在根目录中创建
    mole
    程序,否则将无法执行该程序,这将是一件令人讨厌的事情
  • 因为您将
    cd
    写入根目录(如果它运行过的话),
    mole
    程序将尝试在根目录中创建它的日志文件,但是它应该不能写入根目录中的文件
  • 您不应该以用户
    root
    的身份运行测试代码,也不应该以
    root
    的身份开发测试代码。这太危险了

    我注意到,虽然可以将一个经过修饰的、生产就绪的守护进程放在后台,而不需要日志文件、标准输出和st
    moletrap: 2014-11-19 21:28:48 - pid=9424: Started
    moletrap: 2014-11-19 21:28:49 - pid=9425: about to execute mole 2
    moletrap: 2014-11-19 21:28:59 - pid=9426: about to execute mole 2
    moletrap: 2014-11-19 21:28:59 - pid=9426: failed to execute mole 2
    error (14) Bad address
    moletrap: 2014-11-19 21:29:02 - pid=9424: Send SIGCHLD to 9426
    moletrap: 2014-11-19 21:29:02 - pid=9427: about to execute mole 2
    moletrap: 2014-11-19 21:29:02 - pid=9427: failed to execute mole 2
    error (14) Bad address
    moletrap: 2014-11-19 21:29:12 - pid=9428: about to execute mole 2
    
    moletrap: 2014-11-19 21:33:35 - pid=9456: Started
    moletrap: moletrap: 2014-11-19 21:33:36 - pid=9456: Sleepers awake, salute ...
    2014-11-19 21:33:36 - pid=9457: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:36 - pid=9457: about to execute mole 2
    moletrap: 2014-11-19 21:33:37 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:38 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:39 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:40 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:41 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:42 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:43 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:44 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:45 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:46 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:47 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:48 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:49 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:50 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:51 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:52 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:53 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:54 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:55 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:55 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:55 - pid=9460: about to execute mole 2
    moletrap: 2014-11-19 21:33:55 - pid=9460: failed (2) to execute mole 2
    error (14) Bad address
    moletrap: 2014-11-19 21:33:56 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:57 - pid=9456: Send SIGCHLD to 9460
    moletrap: 2014-11-19 21:33:57 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:57 - pid=9461: about to execute mole 2
    moletrap: 2014-11-19 21:33:57 - pid=9461: failed (2) to execute mole 2
    error (14) Bad address
    moletrap: 2014-11-19 21:33:58 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:33:59 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:00 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:00 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:00 - pid=9462: about to execute mole 2
    moletrap: 2014-11-19 21:34:01 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:02 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:02 - pid=9463: about to execute mole 1
    moletrap: 2014-11-19 21:34:03 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:04 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:05 - pid=9456: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:34:06 - pid=9456: Send SIGTERM to 9463
    moletrap: 2014-11-19 21:34:06 - pid=9456: Exiting
    
    moletrap: 2014-11-19 21:36:53 - pid=9499: Started
    moletrap: moletrap: 2014-11-19 21:36:54 - pid=9499: Sleepers awake, salute ...
    2014-11-19 21:36:54 - pid=9500: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:36:54 - pid=9500: about to execute mole 2
    moletrap: 2014-11-19 21:36:55 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:36:56 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:36:57 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:36:58 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:36:59 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:00 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:01 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:02 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:03 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:04 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:05 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:06 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:07 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:07 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:07 - pid=9501: about to execute mole 2
    moletrap: 2014-11-19 21:37:08 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:08 - pid=9499: Send SIGCHLD to 9501
    moletrap: 2014-11-19 21:37:08 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:08 - pid=9504: about to execute mole 2
    moletrap: 2014-11-19 21:37:09 - pid=9499: Send SIGCHLD to 9504
    moletrap: 2014-11-19 21:37:09 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:09 - pid=9505: about to execute mole 2
    moletrap: 2014-11-19 21:37:10 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:11 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:12 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:13 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:13 - pid=9506: about to execute mole 1
    moletrap: 2014-11-19 21:37:14 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:14 - pid=9499: Send SIGCHLD to 9506
    moletrap: 2014-11-19 21:37:14 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:14 - pid=9507: about to execute mole 1
    moletrap: 2014-11-19 21:37:15 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:15 - pid=9499: Send SIGCHLD to 9507
    moletrap: 2014-11-19 21:37:15 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:15 - pid=9508: about to execute mole 1
    moletrap: 2014-11-19 21:37:16 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:17 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:18 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:19 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:20 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:21 - pid=9499: Sleepers awake, salute ...
    moletrap: 2014-11-19 21:37:21 - pid=9499: Send SIGTERM to 9508
    moletrap: 2014-11-19 21:37:21 - pid=9499: Exiting