2015-06-05 30 views
8

Bir C programında Linux'un bir terminal komutunu çalıştırmak istiyorum. Şu anda system() işlevini kullanıyorum ama system() işlevi MISRA'ya göre yasaklanmış gibi kullanmak istiyorum. Ben Sen fork() faydalanmak ve daha sonra fonksiyonlarının exec() ailesi için bakabilirsinizLinux'taki bir sistem() in linux'da bir terminal komutu yürütmek için

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

MISRA'nın * sisteme * benzer * birşeye izin verdiğinden emin misiniz? Rasgele kod yürütme doğal olarak güvenli değildir. – molbdnilo

+0

Aslında, kodumun MISRA uyumluluğunu denediğimde, sistem() 'nin yasaklanmış bir işlev olduğu konusunda hata veriyor. MISRA allos'un sisteme benzer bir şey olup olmadığından emin değilim. – BKT

+0

Eğer gerçekten ** bir çağrıyı sistem() 'e kullanmanız gerekiyorsa ve bu kararla ilgili tüm sonuçları anlıyorsanız, bir proje sapmasını yükseltin (kitabın ilk bölümlerine bakın) ve hiyerarşinizi onaylatmasını sağlayın. – Andrew

cevap

3

yerini nasıl Örneğin

.

Ayrıca, popen()'a da bakmak isteyebilirsiniz.

3

İlk önce, bir alt işlem oluşturmak için fork() numaralı telefonu kullanabilirsiniz, daha sonra çocuk işleminde istediğiniz komutu çalıştırmak için exec() numaralı telefonu arayabilirsiniz. !
Orada basit bir örnek:

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

#/usr/bin/env bash
ls

************* test.c -l * ***************

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

Bu, Sourav Ghosh'un cevabını, sizinkilerden yaklaşık yarım saat önce yayınlandı. –

+0

@KeithThompson: bu sistem ''() ' – ninjalj

0

Bu çok ilginç bir sorudur. MISRA C'yi anlamam, kritik sistemlerde C dilinin kullanımı için yönergeler sağlamasıdır. Ancak, system işlevini içeren C dili standart kitaplığı, genellikle modern uygulamalarda genellikle kullanılan gömülü kodların toplamının küçük bir parçasıdır - genellikle gömülü sistemlerde bile.

Hiçbir zaman MISRA standartlarına yönelik bir uygulama geliştiremedim ve yalnızca MISRA yönergelerinin biraz daha eski (2004'ten sonraki) sürümünü bulabildim. Anlayabildiğim kadarıyla, MISRA, herhangi bir Linux tabanlı sistemde tipik olarak kullanabileceğiniz POSIX kütüphanesi işlevlerinin kullanımı konusunda sessizdir. MISRA gerçekten POSIX kütüphanesi fonksiyonları hakkında sessizse, bu durumda POSIX kütüphanesindeki tüm işlevlerin sınırlandırılmaması gerekir. Bu, C dil standardına göre değil, POSIX tarafından tanımlanan fork, exec ve popen'u içerir. Üçten, popen muhtemelen C system işlevine işlevsellik/arabirimde benzerdir.

Bu nedenle, MISRA C'nin neden işlevinin kullanımını kısıtladığını ve aynı mantığın yukarıdaki üç işlevin kullanımı için geçerli olup olmadığını sormak isteyebilirsiniz.

+1

ile aynı sorunlara sahip olan popen()' önermez; MISRA'nın mantığı, 'system()' undefined ve impl.defined davranışının çok fazla formunu içerir güvenilir olmak. Ayrıca MISRA'nın, gömülü sistemlere yönelik önyargılı olmasına rağmen, genel bir kodlama standardı olarak, görev kritik yazılımı dışında kullanılabileceğini de unutmayın.MISRA, sadece standart C ile ilgili olduğu için POSIX'i umursamıyor. Ayrıca, gömülü sistemler için bir POSIX işletim sistemi kullanmak çok az, ve hatta daha da önemlisi kritik bir sisteme sahip olmak zorundasınız. Linux veya Windows gibi bazı masaüstü işletim sistemlerini kullanmak. – Lundin

İlgili konular