Загрузка данных


#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <time.h>

/* Пишет строку в лог-файл с меткой времени и PID */
void log_msg(const char *fname, const char *msg) {
    FILE *f = fopen(fname, "a");
    if (!f) return;

    time_t t = time(NULL);
    struct tm *tm = localtime(&t);
    char buf[32];
    strftime(buf, sizeof(buf), "%H:%M:%S", tm);

    fprintf(f, "[%s] PID=%d: %s\n", buf, getpid(), msg);
    fclose(f);
}

int main(void) {
    const char *logfile = "prog.log";

    pid_t pid = fork();

    if (pid == 0) {
        // ===== Дочерний процесс =====
        char msg[64];
        snprintf(msg, sizeof(msg), "ребёнок создан, сплю 10000 сек");
        log_msg(logfile, msg);

        sleep(10000);

        log_msg(logfile, "ребёнок проснулся сам");
        _exit(0);
    }
    else if (pid > 0) {
        // ===== Родительский процесс =====
        char msg[64];
        snprintf(msg, sizeof(msg), "родитель создал ребёнка PID=%d", pid);
        log_msg(logfile, msg);

        sleep(2);

        log_msg(logfile, "родитель шлёт SIGTERM ребёнку");
        kill(pid, SIGTERM);

        int status;
        waitpid(pid, &status, 0);

        if (WIFSIGNALED(status))
            snprintf(msg, sizeof(msg), "ребёнок убит сигналом %d", WTERMSIG(status));
        else
            snprintf(msg, sizeof(msg), "ребёнок завершился, код=%d", WEXITSTATUS(status));
        log_msg(logfile, msg);

        log_msg(logfile, "родитель завершается");
    }
    else {
        perror("fork");
        return 1;
    }
    return 0;
}