Rediriger STDOUT et STDERR de socket en C?
Je suis en train de rediriger STDOUT ET STDERR dans un socket.
J'ai fait:
if(fork() == 0)
{
dup2(newsock, STDOUT_FILENO);
dup2(newsock, STDERR_FILENO);
execvp();
}
En quelque sorte, il n'a montré la première partie de la sortie.
par exemple, il a montré sur "mkdir" quand j'essaie d'exécuter ls ou mkdir.
Quel est le problème?
J'ai essayé le flollowing il fonctionne, mais je ne peux rediriger l'un des STDOUT ou STDERR
close(1);
dup(newsock);
Merci beaucoup.
pourriez-vous svp m'aider sur ce point? merci!
OriginalL'auteur JJ Liu | 2011-11-11
Vous devez vous connecter pour publier un commentaire.
Votre utilisation de
dup2()
a l'air bien, donc, le problème est sans doute ailleurs. Le programme simple j'ai jeté à l'épreuve de ne pas avoir les problèmes que vous rencontrez, donc je vais juste aller sur le noyau de (autour de lafork()
/execvp()
) avec certains de vérification d'erreur omis par souci de concision:Ci-dessus est le noyau d'un serveur très simple (un seul client à la fois) qui, lorsqu'il reçoit une connexion, fourches à un nouveau processus d'exécution d'une commande et envoie ses stderr et stdout pour le client sur le socket. J'espère que vous pourrez résoudre votre problème en examinant -- mais ne vous contentez pas de copier le code sans comprendre ce qu'il fait.
Essayez de vous connecter avec un client telnet premier... si ça marche avec telnet, mais pas avec votre programme client, puis chercher des problèmes dans votre programme client.
OriginalL'auteur Dmitri
Votre utilisation de
dup2
est correct. Votre écriture appels ne sont pas de l'écriture de l'ensemble de la mémoire tampon que vous êtes en leur donnant, comme les données n'a pas été reçu par l'homologue distant encore, et le noyau de la mémoire tampon allouée pour ce qui est plein. L'typiques de la taille de la mémoire tampon est de 64 ko. Vous devriez assurez-vous que le récepteur reçoit les données, et l'enveloppe de votre écrit dans une boucle. Vous pouvez également utiliserMSG_SENDALL
, et lasend
syscall.ls
fonctionne bien et peut liste l'ensemble du répertoire. donc, STDOUT fonctionne très bien. mais quand il doit retournermkdir: sampledirectory already exist
, il retourne uniquementmkdir
Merci beaucoup, s'il vous plaît aider.
OriginalL'auteur Matt Joiner
Lire à nouveau la
man dup2
page (extraits):Il devrait donc être
dup2 (STDOUT_FILENO, newsock);
newsock
pour devenirSTDOUT_FILENO
.Mais il a écrit: "je suis en train de rediriger STDOUT ET STDERR dans un socket." Je ne suis pas un locuteur natif anglais (cours de français), mais n'est pas "la" préposition indiquer la destination?
Le socket est la destination, mais il est la destination de la , ce qui signifie que ce qui est écrit sur la sortie standard stdout ou stderr doivent être envoyés à la prise. Pour ce faire, il a besoin de faire stdout et stderr les doublons de la douille.
C'est une fâcheuse erreur dans
dup2
la page de manuel. Les arguments de " l'ordre est inversé.dup2 (STDOUT_FILENO, newsock);
de fermer la socket selon l'extrait que vous avez cité. L'OP veut garder le socket ouvrir et rediriger la sortie. Pour ce faire, il doit fermer l'ancien stdout et d'en faire une copie de la socket, avecdup2 (newsock, STDOUT_FILENO);
OriginalL'auteur Basile Starynkevitch