2017-04-13 5 views
0

J'ai une affectation de l'université, où j'ai besoin de lire une commande pipe a bash et exec cette commande. Je pense à utiliser l'execv * car je peux créer un tampon en séparant l'espace en tant que délimiteur. Le problème est que je ne peux pas utiliser la bibliothèque STL et je ne peux pas comprendre comment ce tampon doit être créé parce que la taille de ce tampon est variable. Aucune suggestion? Merci à l'avanceBuffer Size pour execv

+0

Choisissez un plafond suffisamment élevé, faire une passe à compter d'abord si vous savez combien vous avez besoin, ou mettre en œuvre votre propre vecteur Growable par un malloc'ing plus grande surface et en copiant les données à chaque fois que vous en avez besoin de plus. –

+0

ouais, je pensais à la limite supérieure mais je ne sais pas quelle devrait être la limite supérieure xD. Pour le vecteur développable je pense que pour implémenter que j'ai besoin de lire deux fois le texte, une fois pour compter et un pour ajouter au tampon. –

+0

Vous pourriez juste choisir 128k ou quelque chose d'autre assez grand pour que vous ne soyez pas susceptible de le frapper dans une affectation (128k était la limite traditionnelle de taille d'octet pour Linux execve). Si vous comptez d'abord, vous n'avez même pas besoin de le faire pousser parce que vous connaissez déjà la taille, et cela fonctionne. La croissance serait juste l'ajout à un tampon de taille N, et si vous atteignez N vous allouer juste celui qui est 2 * N, copier tous les éléments, et continuer à ajouter à cela. –

Répondre

2

Si vous faites seulement une commandes de conduite comme ci-dessous, la taille de la mémoire tampon 30 est suffisant, encore plus

ls -l | wc -l 

Mais vous pouvez soutenir les commandes de tuyaux multiples, vous obtiendrez une commande comme ci-dessous, et votre la taille de la mémoire tampon doit être suffisant, il

cat index.html | grep ".com" | grep ".splunk." | cut -d "<" -f2 | cut -d ">" -f1 | grep ":" | cut -d":" -f2 | cut -d "/" -f3 | cut -d " " -f1 | grep ".splunk." | cut -d '"' -f1 | sort | uniq 

Votre taille de la mémoire tampon doit être 100, je choosed taille 100 pour mes projets de système d'exploitation comme le vôtre, nous avons mis un terminal, il supporte presque tout, des tuyaux multiples, la redirection par exemple ...

En outre, j'ai utilisé execvp comme ci-dessous,

execvp(args[0], &args[0]); 
+0

Merci pour votre réponse. Y at-il une raison spécifique pour laquelle le 100 est suffisant pour la tuyauterie? –

+0

Non, il n'y a pas de raison spécifique, je dis que mon terminal supporte cette valeur de seuil, je pense que c'est assez de valeur, mais vous pouvez implémenter n'importe quelle taille, il n'y a aucune restriction pour le faire –

+0

Bon, merci encore! –