Ubuntu-Daemon не создает файл - PullRequest
       26

Ubuntu-Daemon не создает файл

0 голосов
/ 07 января 2020

Я пытаюсь запустить простой демон на Ubuntu 18.04.2 LTS, который должен записать некоторые данные в файл журнала. Родительский процесс завершается с кодом выхода 0, но файл не создается.

Более того, когда я устанавливаю точку останова после fork(), pid, например, равно 835. Когда я запрашиваю имя процесса этой программы с помощью ps -p 835 -o comm=, я получаю LinuxTest.out <defunct>, но когда я позволяю программе продолжить и снова запрашиваю имя процесса, выходные данные не отображаются, даже если дочерний процесс все еще должен работать из-за бесконечный l oop позже в коде.

Я использую Visual Studio 2019 с удаленной сборкой. Я также попытался войти на сервер S SH и запустить там встроенную программу с правами sudo, но тоже ничего не произошло.

int main() {
    pid_t pid, sid;

    // Fork off the parent process
    pid = fork();

    // if we got a good PID, then we can exit the parent process
    if(pid > 0) exit(EXIT_SUCCESS);
    else exit(EXIT_FAILURE);


    // create new SID for child process
    sid = setsid();
    if(sid < 0) exit(EXIT_FAILURE);

    // change the current working directory
    if(chdir("/") < 0) {
        exit(EXIT_FAILURE);
    }

    // change the file mode mask
    umask(0);

    // close out the  standard file descriptors
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // Open a log file in write mode.
    FILE* fp = fopen("Log.txt", "w+");
    while(1) {
        sleep(1);
        fprintf(fp, "Logging info...\n");
        fflush(fp);
    }
    fclose(fp);
}

Почему точка создания файла не достигнута и почему не сохраняется дочерний процесс?

1 Ответ

3 голосов
/ 07 января 2020

У вас есть:

if(pid > 0) exit(EXIT_SUCCESS);
else exit(EXIT_FAILURE);

При форматировании в более ортодоксальном стиле то же самое, что и:

if (pid > 0)
    exit(EXIT_SUCCESS);
else
    exit(EXIT_FAILURE);

Если fork() завершается успешно, родитель успешно завершает работу и ребенок выходит со статусом отказа; в случае сбоя fork() родитель выходит с состоянием сбоя.

Измените его на:

if (pid > 0)
    exit(EXIT_SUCCESS);
else if (pid < 0)
    exit(EXIT_FAILURE);

/* Child is running here: pid == 0 */
...