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

JJ *_*Liu 5 c bash shell stdout dup

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

我做了:

if(fork() == 0)
{
   dup2(newsock, STDOUT_FILENO);
   dup2(newsock, STDERR_FILENO);
   execvp();
}
Run Code Online (Sandbox Code Playgroud)

不知何故,它只显示了输出的第一个小部分.

例如,当我尝试执行ls或mkdir时,它显示在"mkdir"上.

有什么问题?

我尝试了它的工作,但我只能重定向STDOUT或STDERR之一

close(1);
dup(newsock);
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Dmi*_*tri 10

你的使用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 */
  }
}
Run Code Online (Sandbox Code Playgroud)

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

首先通过telnet客户端连接进行测试...如果它与telnet一起使用但不与您的客户端程序一起使用,那么在客户端程序中查找问题.