我一直在try 用Rust制作一个简单的守护进程,它将使用tcp_流监听端口并打印消息.然而,我遇到了两个问题:
1) 如果我的守护进程使用println!,它崩溃了.如果我删除所有关于println的内容!,守护进程可以工作.在创建守护进程时,stdout/stdin是如何工作的?
One source I found on the Rust mailing list表示,"对于现代的init系统,比如systemd或launchctl,这可以很好地工作,应用程序开发人员不必关心Daemonization,也可以通过stdout简单地完成日志(log)记录."这是什么意思?
2) 当我在非守护程序模式下运行下面的代码时,curls不会立即返回(运行类似于$ curl -XPOST localhost:9337 -d 'hi'
的代码).我得杀了curl服务器才能打印东西.不会自动关闭连接吗?发送的字节在发送后,而不是在连接关闭后,不应该对服务器可用吗?
extern crate getopts;
use getopts::{optflag,getopts};
use std::io::Command;
use std::io::net::tcp::{TcpListener};
use std::io::{Acceptor,Listener};
use std::os;
fn main() {
let args: Vec<String> = os::args();
let opts = [
optflag("d", "daemon", "conver this into a daemon"),
];
let matches = match getopts(args.tail(), opts) {
Ok(m) => { m },
Err(f) => { fail!(f.to_string()) }
};
// Create a daemon? if necessary
if matches.opt_present("d") {
let child = Command::new(args[0].as_slice())
.detached().spawn().unwrap();
println!("Created child: {}", child.id());
// Do I wrap this in unsafe?
child.forget();
return;
}
let listener = TcpListener::bind("127.0.0.1", 9337u16).ok().expect("Failed to bind");
let mut acceptor = listener.listen().ok().expect("Could not listen");
loop {
let mut tcp_stream = acceptor.accept().ok().expect("Could not accept connection");
println!("Accepted new connection");
let message = tcp_stream.read_to_string().unwrap();
println!("Received message {}", message);
}
}