2010-08-27 4 views
1

J'ai une application qui fonctionne avec des sockets et lit/écrit des données. Il utilise Foundation cadre combiné avec CFNetwork et stdio.L'application se comporte différemment lorsque la sortie est redirigée vers un objet NSPipe?

Voici le problème - quand il est lancé à partir de la console (bash shell), il fonctionne à 100% et il n'y a rien de mal à. Cependant, quand il est invoqué par une autre application via NSTask, la folie commence. L'application entière devient folle et ne lit qu'une fois le socket puis raccroche (il est censé quitter une fois terminé).

Cette application ne repose pas sur des variables d'environnement ou d'autres choses comme ça. Ce n'est pas un problème d'utilisateur non plus. Quand il est lancé, il envoie une requête simple au serveur et 'printf est la réponse et lit à nouveau. Cela se produit jusqu'à ce qu'un paquet de terminaison soit reçu.

Je suis vraiment confus, et il me semble qu'il y a quelque chose dans le cadre qui rend l'application folle juste pour énerver le programmeur. En passant, je suis sur Mac OS X Snow Leopard et l'application est pour la même plate-forme.

EDIT 1: Réorientation stdout à un NSPipe cause. Mais pourquoi ?

+0

Cela me rend fou. –

+0

Est-ce que vous faites référence au répertoire de travail actuel de quelque façon que ce soit? – mipadi

+0

Non ................. –

Répondre

0

libc traite différemment un tube/fichier et une console connectée à un (pseudo) terminal. En particulier, la stratégie de mise en mémoire tampon par défaut est différente. Voir la discussion approfondie in this Stack Overflow Q&A. Donc, il est parfaitement concevable qu'un programme qui fonctionne lorsqu'il est connecté à un (pseudo) terminal ne fonctionne pas avec un tuyau. Si vous avez besoin de conseils plus spécifiques, vous devez afficher (au moins le squelette de) votre code.

Questions connexes