【问题标题】:Daemon isn't interacting with notify-send守护进程不与通知发送交互
【发布时间】:2012-05-14 08:16:26
【问题描述】:

这是我的代码

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
#include <iostream>

int main(int argc, char *argv[]) {
    pid_t pid, sid;
    int sec = 10;

    pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
    if (pid > 0) {
        std::cout << "Running with PID: " << pid << std::endl;      
        exit(EXIT_SUCCESS);
    }
    umask(0);        

    sid = setsid();
    if (sid < 0)
        exit(EXIT_FAILURE);

    if ((chdir("/")) < 0)
        exit(EXIT_FAILURE);    /* Log the failure */

    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    while (1) {
        execl("/bin/notify-send", "notify-send", "-t", "3000", "Title", "body", NULL);
        sleep(sec); 
    }
    exit(EXIT_SUCCESS);
}

我希望它每 10 秒发送一次notification。守护进程运行正常,但没有发出任何通知。

【问题讨论】:

    标签: c++ c linux ipc daemon


    【解决方案1】:

    execl 不返回 - 它用新程序替换正在运行的程序。所以用sleep循环运行它是没有意义的——它只会运行一次。

    我认为您应该改用system。它执行一个命令并返回。

    另一种方法是每次循环都使用fork,让子代执行execl,而父代将继续循环。

    【讨论】:

    • 我没有看到在守护进程中运行它的问题。 system 受环境变量影响,所以如果有人可以更改您的守护进程的环境,他可能会造成麻烦。但用户不应有权访问系统守护程序的环境。
    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2011-10-06
    • 1970-01-01
    相关资源
    最近更新 更多