當我試着寫用C在linux下一個守護進程,我被告知我應該後叉代碼塊中添加以下代碼:編寫Linux守護進程時,爲什麼必須從tty中分離出來?
/* Preparations */
...
/* Fork a new process */
pid_t cpid = fork();
if (cpid == -1){perror("fork");exit(1);}
if (cpid > 0){exit(0);}
/* WHY detach from tty ? */
int fd = open("/dev/tty", O_RDWR);
ioctl(fd, TIOCNOTTY, NULL);
/* Why set PGID as current PID ? */
setpgid(getpid(), 0);
我的問題是: 有一個必須做以上操作?
我想部分原因是守護進程不希望寫輸出或讀輸入。如果你要開始,例如在SSH會話中使用HTTP服務器,您不會期望會話中的隨後的警告輸出。 – 2012-01-08 12:48:11
@JohnChadwick你說的確實是你在轉換成守護進程時想要做的事情之一,但是通過關閉stdin,stdout和stderr來實現這一點。您從終端上分離以避免某些信號(請參閱下面的答案)。 – 2012-01-08 13:01:22
你可以「不接受」我的回答並接受@ AdamZalcman的代替嗎?他比我做得好得多。他對setsid()完全正確,你應該使用它。 – fge 2012-01-08 13:05:55