2010-02-11 4 views
3

J'utilise Linux noyau 2.6.30 sur ma carte. Il a 128 Mo de DDR2. Mon application principale occupe près de 80 Mo de mémoire système. Après l'exécution de toutes les applications, il ne reste que 25 Mo. Je veux exécuter les commandes système de mon application principale (qui utilise 80 Mo). Mais ce n'est pas exécuté. Selon ma compréhension, chaque processus enfant nécessite la même mémoire que le processus parent (j'ai obtenu cette description du manuel de la fonction fourche). Donc, dans mon cas, le nouveau processus enfant nécessite un autre 80 Mo qui n'est pas disponible. Par conséquent, l'appel système ne fonctionne pas. La commande système doit s'exécuter immédiatement après avoir donné la commande car les étapes suivantes dans l'application principale nécessitent le résultat de la commande système (comme la nécessité de stocker la sortie de la commande grep dans le fichier et de la lire immédiatement pour traitement ultérieur). Par conséquent, je ne peux pas utiliser le mécanisme IPC. Quelles sont les autres façons?Problème de création de processus enfant Linux embarqué

Saurabh Shah

Répondre

1

Sauf si vous avez une architecture CPU bizarre, cassé ou libc il devrait utiliser Copy-on-Write avec fork(), donc vous devriez être très bien avec un exec() juste après.

+1

Peut-être OP a désactivé overcommit? – ephemient

1

Si vous utilisez system() alors il faudra exécuter le shell pour analyser et exécuter votre commande, et le shell pourrait être grand. Si vous pouvez diviser la chaîne en une commande et des arguments vous-même, vous pouvez appeler directement fork() et execve() afin que le shell n'ait pas besoin d'être chargé.

0

Si par hasard votre système embarqué a installé glib, vous pouvez essayer d'utiliser leurs équivalents d'appels système.

Voir: http://library.gnome.org/devel/glib/2.22/glib-Spawning-Processes.html

g_spawn_sync en particulier, semble faire ce que vous avez besoin.

Malheureusement, l'appel system() est souvent difficile d'obtenir de bons codes d'erreur. Je pense qu'il vaudrait la peine d'essayer fork() et exec() (comme les autres affiches suggérées) pour voir si elles vous retournent un code d'erreur plus détaillé, et si c'est fork() ou exec() (ou quelque chose d'autre) qui échoue.

Si vous pouvez rassembler ces informations supplémentaires, cela peut aider d'autres personnes à faciliter le débogage.

0

Vous devriez essayer une fourche simple d'abord, et voir ce qui se passe. Je pense que j'ai rencontré un problème similaire, avec un serveur de thttpd à court de mémoire pour aucune raison. Aussi un outil très utile, est strace.
stravez votre processus, et vous serez en mesure de voir quel appel système échoue, et de fournir plus d'informations aux gens ici.

En outre, je ne vois pas pourquoi IPC n'est pas une solution. Peut-être plus compliqué, mais toujours une solution. Par exemple, vous pouvez utiliser un socket de domaine Unix pour obtenir un canal bidirectionnel.

Questions connexes