gpt4 book ai didi

c - 将 STDOUT 和 STDERR 重定向到 C 中的套接字?

转载 作者:太空狗 更新时间:2023-10-29 15:14:18 25 4
gpt4 key购买 nike

我正在尝试将 STDOUT 和 STDERR 重定向到套接字。

我做到了:

if(fork() == 0)
{
dup2(newsock, STDOUT_FILENO);
dup2(newsock, STDERR_FILENO);
execvp();
}

不知何故,它只显示了输出的前一小部分。

例如,当我尝试执行 ls 或 mkdir 时,它显示在“mkdir”上。

有什么问题?

我尝试了以下方法,但我只能重定向 STDOUT 或 STDERR 之一

close(1);
dup(newsock);

非常感谢。

最佳答案

您对 dup2() 的使用看起来没问题,所以问题可能出在其他地方。我放在一起测试的简单程序没有您遇到的问题,所以我将只介绍它的核心(围绕 fork()/execvp() 区域),为简洁起见省略了一些错误检查:

int    lsock, /* listening socket */
csock; /* active connection's socket */
pid_t cpid; /* child process ID from fork() */
char *cmd = "somecommand";
char *cmd_args[] = { "somecommand",
"firstarg",
"secondarg",
"howevermanyargs",
NULL }; /* note: last item is NULL */
/* ...
call socket(), bind(), listen(), etc.
... */

for (;;) { /* loop, accepting connections */
if ( (csock = accept( lsock, NULL, NULL )) == -1) exit(1);
cpid = fork();
if (cpid < 0) exit(1); /* exit if fork() fails */
if ( cpid ) {
/* In the parent process: */
close( csock ); /* csock is not needed in the parent after the fork */
waitpid( cpid, NULL, 0 ); /* wait for and reap child process */
} else {
/* In the child process: */
dup2( csock, STDOUT_FILENO ); /* duplicate socket on stdout */
dup2( csock, STDERR_FILENO ); /* duplicate socket on stderr too */
close( csock ); /* can close the original after it's duplicated */
execvp( cmd, cmd_args ); /* execvp() the command */
}
}

上面是一个非常基本的服务器(一次只有一个客户端)的核心,当它接收到连接时,派生一个新进程来运行命令并通过套接字将其 stderr 和 stdout 发送到客户端。希望您可以通过检查来解决您的问题——但不要在不了解它的作用的情况下只是复制代码。

首先尝试通过连接 telnet 客户端进行测试...如果它适用于 telnet 但不适用于您的客户端程序,那么请在您的客户端程序中查找问题。

关于c - 将 STDOUT 和 STDERR 重定向到 C 中的套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com