#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;
}