2015-06-05 11 views
8

Ich mag einen Terminal-Befehl von Linux in einem C-Programm auszuführen. Zur Zeit verwende ich system() Funktion, aber ich möchte jede andere verwenden, da die system() Funktion wie MISRA verboten ist.Alternative des Systems() in c Linux einen Terminal-Befehl auf Linux auszuführen

Zum Beispiel, wie ich

system("hwclock --systohc --utc"); 
+0

Sind Sie sicher, dass MISRA etwas sogar * ähnlich * zu 'system' erlaubt? Die Ausführung von beliebigem Code ist von Natur aus unsicher. – molbdnilo

+0

Eigentlich, als ich für MISRA-Konformität meines Codes versuchte, gibt es Fehler, dass System() eine verbotene Funktion ist. Ich bin mir nicht sicher, ob MISRA etwas dem System ähnlich macht. – BKT

+0

Wenn Sie wirklich ** einen Aufruf von system() verwenden müssen und Sie alle Implikationen verstehen, die mit dieser Entscheidung einhergehen, erhöhen Sie eine Projektabweichung (siehe die ersten Kapitel des Buches) und holen Sie sich Ihre Hierarchie, um sie zu genehmigen. – Andrew

Antwort

3

Sie können von fork() machen ersetzen kann und dann für exec() Familie von Funktionen nachzuschlagen.

Alternativ können Sie auch einen Blick auf popen() haben wollen.

3

Zuerst können Sie fork() verwenden, um einen untergeordneten Prozess zu erstellen, dann können Sie im untergeordneten Prozess exec() aufrufen, um den Befehl auszuführen, was Sie wollen.
Es ist ein einfaches Beispiel:

$ chmod u+x command.sh 
$ cat command.sh 

#/usr/bin/env bash
ls -l

************* test.c * ***************

#include<unistd.h> 
int main(void) 
{ 
    execl("./command.sh","command.sh",(char*)0); 
    return 0; 
} 
+1

Was fügt das zu Sourav Ghoshs Antwort hinzu, die ungefähr eine halbe Stunde vor deiner veröffentlicht wurde? –

+0

@KeithThompson: dies empfiehlt nicht, 'popen()', die die gleichen Probleme wie 'System hat()' – ninjalj

0

Dies ist eine sehr interessante Frage. Mein Verständnis von MISRA C ist, dass es Richtlinien für die Verwendung der C-Sprache in kritischen Systemen bietet. Aber die C-Sprachen-Standardbibliothek, die die system-Funktion enthält, ist nur ein kleiner Teil der Summe des Bibliothekscodes, der typischerweise in modernen Anwendungen verwendet wird - oft sogar in eingebetteten Systemen.

Ich habe noch nie eine Anwendung zu MISRA Standards entwickelt, und ich habe nur in der Lage gewesen, eine etwas älteren (ab 2004) Version der MISRA-Richtlinien zu finden. Soweit ich das beurteilen kann, schweigt MISRA über die Verwendung von POSIX-Bibliotheksfunktionen, die Sie normalerweise auf jedem Linux-basierten System zur Verfügung haben. Wenn MISRA wirklich nichts über POSIX-Bibliotheksfunktionen sagt, sollten alle Funktionen in der POSIX-Bibliothek uneingeschränkt funktionieren. Das würde fork, exec und popen die alle von POSIX definiert sind, nicht durch die Sprache C-Standard. Von den drei ist popen wahrscheinlich am ähnlichsten in Funktionalität/Schnittstelle zu der C system Funktion.

Sie könnten sich fragen, warum MISRA C die Verwendung der system-Funktion einschränkt und ob für die Verwendung der obigen drei Funktionen dasselbe gilt.

+1

Die Begründung von MISRA ist, dass 'System()' enthält zu viele Formen von undefiniertem und impl.defined Verhalten vertrauenswürdig sein. Beachten Sie auch, dass MISRA als allgemeiner Kodierungsstandard außerhalb von unternehmenskritischer Software verwendet werden kann, obwohl es auf eingebettete Systeme ausgerichtet ist.MISRA kümmert sich nicht um POSIX, da es sich nur um Standard C handelt. Es ist auch selten, dass ein POSIX-Betriebssystem für eingebettete Systeme verwendet wird, und noch weniger für geschäftskritische Systeme, für die Sie ziemlich verrückt sein müssten um ein Desktop-Betriebssystem wie Linux oder Windows zu verwenden. – Lundin