2015-06-05 17 views
8

Voglio eseguire un comando di terminale di Linux in un programma C. Attualmente sto usando la funzione system() ma voglio usare qualsiasi altra come la funzione system() è bannata come da MISRA.Alternativa di system() in c Linux per eseguire un comando di terminale su linux

Per esempio, come posso sostituire

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

Sei sicuro che MISRA permetta qualcosa anche * simile * a 'sistema'? L'esecuzione di codice arbitrario è intrinsecamente non sicura. – molbdnilo

+0

In realtà quando ho provato per la conformità MISRA del mio codice che dà errore che system() è una funzione vietata. Non sono sicuro che MISRA abbia qualcosa di simile al sistema. – BKT

+0

Se ** ** è veramente necessario utilizzare una chiamata a system() e capisci tutte le implicazioni che derivano da tale decisione, aumenta la deviazione del progetto (vedi i primi capitoli del libro) e ottieni la tua gerarchia per approvarla. – Andrew

risposta

3

Si può fare uso di fork() e poi cercare per exec() famiglia di funzioni.

In alternativa, si consiglia di dare un'occhiata a popen() anche.

3

Innanzitutto è possibile utilizzare fork() per creare un processo secondario, quindi nel processo figlio, è possibile chiamare exec() per eseguire il comando ciò che si desidera.
V'è un semplice esempio:!

$ 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

Cosa aggiunge questo alla risposta di Sourav Ghosh, che è stata pubblicata circa mezz'ora prima della tua? –

+0

@KeithThompson: questo non consiglia 'popen()', che ha gli stessi problemi di 'system()' – ninjalj

0

Questa è una domanda molto interessante. La mia comprensione di MISRA C è che fornisce linee guida per l'uso del linguaggio C in sistemi critici. Ma la libreria standard del linguaggio C, che include la funzione system, è semplicemente una piccola parte della somma totale del codice di libreria tipicamente utilizzato nelle applicazioni moderne, spesso anche nei sistemi embedded.

Non ho mai sviluppato un'applicazione per gli standard MISRA e sono riuscito a trovare solo una versione leggermente più vecchia (dal 2004) delle linee guida MISRA. Da quello che posso dire, MISRA tace sull'uso delle funzioni di libreria POSIX, che tipicamente avrete a disposizione su qualsiasi tipo di sistema basato su Linux. Se MISRA tace davvero sulle funzioni della libreria POSIX, allora è ovvio che qualsiasi funzione nella libreria POSIX dovrebbe essere illimitata. Ciò include fork, exec e popen, tutti definiti da POSIX, non dallo standard di linguaggio C. Dei tre, popen è probabilmente la più simile in funzionalità/interfaccia alla funzione C system.

Detto questo, è possibile chiedersi perché MISRA C limita l'uso della funzione system e se la stessa logica si applica o meno all'utilizzo delle tre funzioni precedenti.

+1

La logica di MISRA è che 'system()' contiene troppe forme di comportamento indefinito e impl.defined essere fidati. Si noti inoltre che MISRA può essere utilizzato al di fuori del software mission-critical, come standard di codifica generale, sebbene sia distorto nei confronti dei sistemi embedded.MISRA non si preoccupa di POSIX poiché si preoccupa solo dello standard C. Inoltre, è raro utilizzare un sistema operativo POSIX per sistemi embedded, e ancor meno nei sistemi mission-critical, per i quali si dovrebbe essere abbastanza pazzi utilizzare alcuni SO desktop come Linux o Windows. – Lundin