我想写一个init系统,我想生成一个没有IO的进程。意思是,我不想看到输出或者让它接受输入。我目前使用的功能从suckless的sinit -
void spawn(char *const argv[]) {
switch (fork()) {
case 0:
sigprocmask(SIG_UNBLOCK, &set, NULL);
setsid();
execvp(argv[0], argv);
perror("execvp");
_exit(1);
break;
case -1:
perror("fork");
break;
default:
break;
}
}
但是如果我启动一个进程(使用top
作为测试),它不会"在后台"运行。我怎么能做到呢?
所有进程都希望从父进程继承文件描述符0、1和2,分别作为标准输入、输出和错误。
传统的方法是将它们重定向到/dev/null
。所有输出都消失,任何从标准输入中读取的尝试都会立即显示文件结束指示。
将它们重定向到/dev/null
,包括关闭它们,并在它们的位置打开/dev/null
。
void spawn(char *const argv[]) {
switch (fork()) {
case 0:
sigprocmask(SIG_UNBLOCK, &set, NULL);
setsid();
close(0);
close(1);
close(2);
open("/dev/null", O_RDONLY);
open("/dev/null", O_WRONLY);
open("/dev/null", O_wRONLY);
execvp(argv[0], argv);
鲁棒性表明仔细检查每个open()
是否成功。但是,如果打开/dev/null
失败,您将有更多的问题需要担心。