2010-08-24 4 views
0

EDIT 1NSTask génère le processus supérieur. Comment extraire des données?

Ce code est en cours d'impression sur la console. Ce que je voudrais faire est d'obtenir les données dans une chaîne (et arrêter les données allant à la console) afin que je puisse analyser pour des informations spécifiques. J'espère que ma question est claire. S'il vous plaît demander des éclaircissements si nécessaire :)


EDIT 2

Une autre alternative pourrait être d'imprimer dans un fichier, puis je pouvais lire à partir de ce fichier par la suite. Juste ne veulent pas l'impression à la console :)


Bonjour les gens intelligents d'ordinateur intelligent!

Toute aide avec ce serait génial.

Jusqu'à présent, je suis en utilisant NSTask de lancer un processus:

NSTask *top_task; 
top_task = [[NSTask alloc] init]; 
[top_task setLaunchPath: @"/usr/bin/top"]; 

NSArray *arguments; 
arguments = [NSArray arrayWithObjects: @"-s", @"1",@"-l",@"3600",@"-stats",@"pid,cpu,time,command", nil]; 
[top_task setArguments: arguments]; 


NSPipe *pipe; 
pipe = [NSPipe pipe]; 

[top_task setStandardInput:[NSPipe pipe]]; 

NSFileHandle *file; 
file = [pipe fileHandleForReading]; 

[top_task launch]; 

Maintenant, comment puis-je saisis les informations obtenues, disons, sous la forme d'un NSString?

Merci pour tout et n'importe quelle aide! :)

Répondre

3

Pour lancer votre minuterie, vous voulez faire quelque chose comme ceci:

NSTask *topTask = [NSTask new]; 
[topTask setLaunchPath:@"/usr/bin/top"]; 
[topTask setArguments:[NSArray arrayWithObjects:@"-s", @"1", @"-l", @"3600", @"-stats", @"pid,cpu,time,command", nil]]; 

NSPipe *outputPipe = [NSPipe pipe]; 
[topTask setStandardOutput:outputPipe]; 
[topTask launch]; 

Jusqu'à présent, le code est vraiment semblable à ce que vous avez écrit, mais vous allez devoir ajouter un peu plus de code à lui. Pour obtenir des données chaque fois que top mises à jour, vous ajoutez cette ligne de code à la fin:

[[outuputPipe fileHandleForReading] readToEndOfFileInBackgroundAndNotify]; 

que vous enverrez un NSFileHandleReadToEndOfFileCompletionNotification (si vous vous inscrivez pour elle) chaque fois que top mises à jour avec la sortie, et vous pouvez interroger l'objet de notification pour les données entrantes et le convertir en un NSString comme celui-ci:

NSString *outputString = [[[NSString alloc] initWithData:[[notification userInfo] objectForKey:NSFileHandleNotificationDataItem] encoding:NSUTF8StringEncoding] autorelease]; 

vous pouvez lire à ce sujet dans le NSFileHandle documentation et Interacting With the Operating System.

0

Vous pourriez le faire comme ça:

[top_task waitUntilExit]; 
NSString *string = [[NSString alloc] initWithData:[file readDataToEndOfFile] encoding:NSUnicodeStringEncoding] autorelease]; 
+0

Cela ne semble pas fonctionner :( –

+0

Oh, à droite, vous devez ajouter ceci: [top_task setStandardOutput: top_pipe]; –

+0

Est-ce que 'waitUntilExit' attend la fin de la tâche? –

1

Vous configurez un tuyau d'entrée standard sans raison apparente. Je pense que vous voudriez un tuyau pour la sortie standard, puis lisez à partir de cela.

Questions connexes