diff --git a/src/main.cc b/src/main.cc
index 0849e45d1a98c2d6c13e26ee1e4ec8c400ed7bb7..7e5d98b6b19fc2099cee405cdee39663ece8d7c9 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -365,6 +365,12 @@ background()
 	if (setsid() == -1)
 		goto error;
 
+	/*
+	 * tell libev we've just forked, this is necessary to re-initialize
+	 * kqueue on FreeBSD.
+	 */
+	ev_loop_fork(cord()->loop);
+
 	/*
 	 * reinit signals after fork, because fork() implicitly calls
 	 * signal_reset() via pthread_atfork() hook installed by signal_init().