История изменений
Исправление
kirk_johnson,
(текущая версия)
:
Правда что-ли?
Код:
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include <unistd.h>
#define log(fmt, ...) syslog(0, (fmt), ##__VA_ARGS__)
int main(int argc, char *argv[])
{
int ret;
openlog("session-leader-not-so-much", LOG_PID, LOG_USER);
log("Hi! I'm a slave in session #%d :(\n", getsid(0));
switch (fork()) {
case -1:
err(EXIT_FAILURE, "failed to fork of a child");
case 0:
ret = setsid();
if (ret == -1)
err(EXIT_FAILURE, "failed to start a new session");
break;
default:
exit(EXIT_SUCCESS);
}
switch (fork()) {
case -1:
err(EXIT_FAILURE, "failed to fork of a child");
case 0:
sleep(1);
openlog("session-slave", LOG_PID, LOG_USER);
log("Hi! I'm a slave in session #%d\n", getsid(0));
log("Oh no! My session leader is going to die!\n");
sleep(5);
log("Fuck... Guess I'm still alive!\n");
break;
default:
openlog("session-leader", LOG_PID, LOG_USER);
log("Yay! I'm a session leader for session #%d now!\n", getsid(0));
sleep(3);
}
exit(EXIT_SUCCESS);
}
Вывод:
May 30 09:27:57 host session-leader-not-so-much[10259]: Hi! I'm a slave in session #4572 :(
May 30 09:27:57 host session-leader[10260]: Yay! I'm a session leader for session #10260 now!
May 30 09:27:58 host session-slave[10261]: Hi! I'm a slave in session #10260
May 30 09:27:58 host session-slave[10261]: Oh no! My session leader is going to die!
May 30 09:28:03 host session-slave[10261]: Fuck... Guess I'm still alive!
Давай ты будешь хорошим мальчиком, прочитаешь man'ы и перестанешь позориться? SIGHUP посылается только если управляющий терминал немного умрет.
P.S. double fork здесь штоп лучше проиллюстрировать что происходит.
Исходная версия
kirk_johnson,
:
Правда что-ли?
Код:
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include <unistd.h>
#define log(fmt, ...) syslog(0, (fmt), ##__VA_ARGS__)
int main(int argc, char *argv[])
{
int ret;
openlog("session-leader-not-so-much", LOG_PID, LOG_USER);
log("Hi! I'm a slave in session #%d :(\n", getsid(0));
switch (fork()) {
case -1:
err(EXIT_FAILURE, "failed to fork of a child");
case 0:
ret = setsid();
if (ret == -1)
err(EXIT_FAILURE, "failed to start a new session");
fclose(stdin);
fclose(stdout);
fclose(stderr);
break;
default:
exit(EXIT_SUCCESS);
}
switch (fork()) {
case -1:
err(EXIT_FAILURE, "failed to fork of a child");
case 0:
sleep(1);
openlog("session-slave", LOG_PID, LOG_USER);
log("Hi! I'm a slave in session #%d\n", getsid(0));
log("Oh no! My session leader is going to die!\n");
sleep(5);
log("Fuck... Guess I'm still alive!\n");
break;
default:
openlog("session-leader", LOG_PID, LOG_USER);
log("Yay! I'm a session leader for session #%d now!\n", getsid(0));
sleep(3);
}
exit(EXIT_SUCCESS);
}
Вывод:
May 30 09:27:57 host session-leader-not-so-much[10259]: Hi! I'm a slave in session #4572 :(
May 30 09:27:57 host session-leader[10260]: Yay! I'm a session leader for session #10260 now!
May 30 09:27:58 host session-slave[10261]: Hi! I'm a slave in session #10260
May 30 09:27:58 host session-slave[10261]: Oh no! My session leader is going to die!
May 30 09:28:03 host session-slave[10261]: Fuck... Guess I'm still alive!
Давай ты будешь хорошим мальчиком, прочитаешь man'ы и перестанешь позориться? SIGHUP посылается только если управляющий терминал немного умрет.
P.S. double fork здесь штоп лучше проиллюстрировать что происходит.