【问题描述】 使用procd做为1号进程,在rc.local中启动了一个应用程序,程序中使用了printf打印,发现会阻塞程序,在/proc/xxx/fd中查看文件描述符指向一个管道。
【解决方法】 将全志提供的一个patch放到tina/package/system/procd/patches目录下。 patch内容如下,也可以自己新建一个patch文件:
--- a/rcS.c
+++ b/rcS.c
@@ -26,7 +26,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <glob.h>
-
+#include <fcntl.h>
#include <libubox/ustream.h>
#include "procd.h"
@@ -88,6 +88,7 @@
if (pid) {
close(pipefd[1]);
+ fcntl(pipefd[0], F_SETFD, FD_CLOEXEC);
s->fd.stream.string_data = true,
s->fd.stream.notify_read = pipe_cb,
runqueue_process_add(q, &s->proc, pid);
--- a/service/instance.c
+++ b/service/instance.c
@@ -417,11 +417,13 @@
if (opipe[0] > -1) {
ustream_fd_init(&in->_stdout, opipe[0]);
closefd(opipe[1]);
+ fcntl(opipe[0], F_SETFD, FD_CLOEXEC);
}
if (epipe[0] > -1) {
ustream_fd_init(&in->_stderr, epipe[0]);
closefd(epipe[1]);
+ fcntl(epipe[0], F_SETFD, FD_CLOEXEC);
}
service_event("instance.start", in->srv->name, in->name);