Използването на 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, но не и с вашата клиентска програма, тогава потърсете проблеми във вашата клиентска програма.
person
Dmitri
schedule
12.11.2011