LINUX.ORG.RU

История изменений

Исправление 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 здесь штоп лучше проиллюстрировать что происходит.