我可以将父进程的stderrredirect到分支进程上的套接字文件描述符吗?

我编写了一个守护进程,在开发过程中,它的debugging信息会进入stderr(在完全被“守护进程”之前)。 现在代码更成熟了,所以stderr已经通过freopen(2)调用redirect到了/dev/null 。 为了debugging的目的,我真的希望能够连接到服务器守护进程,发送一个命令,神奇地开始通过套接字发送stderrstream。

有没有一种方法(在分叉的过程中)对父进程的 stderr 对subprocess套接字文件描述符执行“ dup(2) ”类似的操作? 只有Linux的解决scheme是可以接受的

有大量的代码打印到stderr为了validation的目的 ,我宁愿不去碰。

如果dup2可以做我所要求的,这将工作: redirectSTDOUT和STDERR到C中的套接字?

Solutions Collecting From Web of "我可以将父进程的stderrredirect到分支进程上的套接字文件描述符吗?"

一旦进程有fork(2) ,子进程和父进程就不会共享文件描述符表,所以一个进程中的操作不会影响另一个。 Linux特定的clone(2)系统调用允许进程使用CLONE_FILES共享文件描述符表,文件系统信息(文件系统根目录,当前工作目录,umask)可以与CLONE_NS共享。 使用clone(2)可能太大,为了你的目的重写 – 而且因为它不寻常,所以使用clone(2)可能会很烦人。

bmargulies建议的另一种方法是创建父进程的“错误服务器”部分,告诉客户端connect(2)哪个端口来读取错误信息。 如果你坚持使用TCP,它将通过网络工作,但是没有一些认证和授权代码是开放的。 如果使用unix(7)套接字,则可以使用SCM_CREDENTIALS消息来检查连接过程的用户,组和pid。

您也可以在fork(2)之前使用pipe(2)系统调用为每个孩子创建一个新的pipe(7) ,如果孩子不需要调试信息,则浪费文件描述符。

如果您使用unix(7)套接字来提供父对子通信,则可以使用SCM_RIGHTS消息将文件描述符从一个进程发送到另一个进程 – 您可以让父节点发送pipe(7)socket(7)给孩子阅读或让孩子向父母发送一个pipe(7)socket(7)进行书写。

一旦父进程分叉,孩子无法强制改变父进程中的任何东西的状态。 可以设想与父母进行沟通,并要求它改变写出标准错误输出的位置,但孩子不能强迫父母这样做。 此外,如果父分支(通常会这样)关闭套接字到客户端,那么它不能与客户端轻松通信。

有一些方法可以在进程之间迁移(套接字)文件描述符,但是我可以肯定的是,这也是一个合作的过程。 如果你想沿着这条路线走下去,那么这个页面就描述了要做什么,并链接到客户端和服务器端的程序来完成这个工作。 (您需要一个AF_UNIX套接字连接,并使用子守护进程中的sendmsg()和父守护进程中的recvmsg() 。通过该设置,子守护进程可以将客户端的套接字连接传递给父守护进程,父守护进程然后将接收到的文件描述符dup2()变为2(标准错误),然后关闭接收到的原始描述符,然后将标准错误输出发送到客户端。

这需要小心设置,并且(如前所述)儿童和父守护进程之间的合作。 我自己并没有直接这样做,所以我不确定这个过程中的陷阱。 我知道它至少在类Unix系统上实际上可以广泛使用。

dup2什么问题?

在父, socket和父connect ,并传递在argv中的数字。 将管道写入侧的文件描述符传递给argv中的子项。 然后close(2)dup2(numberFromArgv, 2)

或者,只要将错误服务器的端口号传给孩子(或硬连线),让它调用socketconnectdup2

来想一想,我敢打赌,这里的主要问题是“f”部分。 在打开freopen之后,描述符号可能不再是'2'。 调用fileno来获得编号,然后使用dup2将套接字移动到该编号。