echo komutunu kendi programımda nasıl kullanırım?

Başlatan yamak, 20 Şubat 2013, 00:55:09

yamak

mesela bazı programlara
echo 9 > GPIO1
gibi komut ile parametre gönderebiliyoruz.Bunu ben kendi programıma nasıl uygularım.

Seckin ALAN

#1
hangi dil ile yazıyorsun?
python ? c++ ?
--------------------------------------------
python
>>> import os
>>> os.system("echo Merhaba Dünya")
>>> os.system("echo 9 > GPIO1 ")

c ve c++
#include <stdlib.h>       
#include <stdio.h>        
int system(const char *command);       
                          
int main(){               
    int command = system("echo 9 > GPIO1");
     // 0 ise başarılı
    printf("%d\n",command);
}
Kar taneleri ne güzel anlatıyor, birbirlerine zarar vermeden de yol almanın mümkün olduğunu.. Mevlana

yamak

Siz beni yanlış anladınız galiba. Ben programım içinden bash'komut göndermek istemiyorum.echo komutu ile kendi programıma parametre göndermek istiyorum.Örneğin echo ile gönderdiğim sayıyı 5 ile toplayıp ekrana yazmasını istiyorum.Örnek:
echo 6 > benim_program
sonuc=11

controller

Anladığım kadarıyla bahsettiğiniz GPIO1 program değil aygıt dosyası (device file).

Kendi programınız içinden bu aygıt dosyasını "open" fonksiyonu ile açıp "write" fonksiyonu ile veri yazabilirsiniz.

Programa parametre göndermek için daha çok command line argument kullanılır.

./topla 5 3
8

gibi.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

Tagli

Anahtar kelime "pipe". Bu arada, echo 6 > program şeklinde olmaz, bu dosyalara yazmak içindir. echo 6 | program şeklinde olmalı. Program tarafında özel birşey yapmaya gerek de yok. Pipe oluşunca - ki bu işletim sistemi tarafından yapılır - soldaki programın stdout'u sağdaki programın stdin'ine bağlanır. Yani senin programın klavyeden veri okuyormuş gibi çalışacak. Ama o veri klavyeden değil echo'dan gelecek. Senin programın bunu bilmeyecek, bilmesine gerek de yok zaten.

Yalnız bir de şöyle bir durum var: echo ile göndereceğine doğrudan niye göndermiyorsun ki?

Çalışmaya başlamış programa bu şekilde komut gönderemezsin ama. Verdiğin örnekte program değil aygıt node'u (dosya gibi düşünebilirsin) var, o yüzden veri göndermek mümkün olmuş. Çalışmaya başlamış programa sonradan veri göndermek için sinyal kavramını araştırman faydalı olabilir.

Yukarıda anlattığım durumun bir istisnası "named pipe" kullanımı olabilir. Bu şekilde önceden başlamış bir programa veri göndermem mümkün.
Gökçe Tağlıoğlu

trgtylcnky

Yapmak istediğiniz şey sanırım programı çalıştırırken argüman kullanmak. Konsoldan banim_program 6 komutuyla çalıştırabilmek için:
int main(int *args){
    int sonuc=args[1]+5;
    printf("Toplam: %d",sonuc);
    return 0;
}

mufitsozen

#6
Alıntı yapılan: trgtylcnky - 20 Şubat 2013, 13:59:09
Yapmak istediğiniz şey sanırım programı çalıştırırken argüman kullanmak. Konsoldan banim_program 6 komutuyla çalıştırabilmek için:
int main(int *args){
    int sonuc=args[1]+5;
    printf("Toplam: %d",sonuc);
    return 0;
}


sayin @trgtylcnky


    int sonuc=args[1]+5;


yerine

int sonuc =0;
if ( argc > 1 ) {
    sonuc = atoi( argv[1]) + 5;
}


yazsa idiniz  program dogru sonuc verebilirdi.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

Alıntı yapılan: trgtylcnky - 20 Şubat 2013, 13:59:09
Yapmak istediğiniz şey sanırım programı çalıştırırken argüman kullanmak. Konsoldan banim_program 6 komutuyla çalıştırabilmek için:
int main(int *args){
    int sonuc=args[1]+5;
    printf("Toplam: %d",sonuc);
    return 0;
}

Hayır bundan bahsetmiyorum.
Alıntı yapılan: Tagli - 20 Şubat 2013, 13:55:06
Anahtar kelime "pipe". Bu arada, echo 6 > program şeklinde olmaz, bu dosyalara yazmak içindir. echo 6 | program şeklinde olmalı. Program tarafında özel birşey yapmaya gerek de yok. Pipe oluşunca - ki bu işletim sistemi tarafından yapılır - soldaki programın stdout'u sağdaki programın stdin'ine bağlanır. Yani senin programın klavyeden veri okuyormuş gibi çalışacak. Ama o veri klavyeden değil echo'dan gelecek. Senin programın bunu bilmeyecek, bilmesine gerek de yok zaten.

Yalnız bir de şöyle bir durum var: echo ile göndereceğine doğrudan niye göndermiyorsun ki?

Çalışmaya başlamış programa bu şekilde komut gönderemezsin ama. Verdiğin örnekte program değil aygıt node'u (dosya gibi düşünebilirsin) var, o yüzden veri göndermek mümkün olmuş. Çalışmaya başlamış programa sonradan veri göndermek için sinyal kavramını araştırman faydalı olabilir.

Yukarıda anlattığım durumun bir istisnası "named pipe" kullanımı olabilir. Bu şekilde önceden başlamış bir programa veri göndermem mümkün.
Hocam pipe olayını biliyorum ama behsettiğim şey pipe değil.Örneğin Qnx için yazılmış bir led driver var.Bu led driver sistemi derlerken sistem binaryleri arasına eklediğinizde sistemde /dev dizini altında Led adında bi aygıt oluşmakta.Bu aygıtın ismini tabi programda biz belirliyoz.Daha sonra
echo 9 > /dev/Led dediğimizde BeagleBone üzerinde ledlerden 1. ve 4. sü yanıyo.Benim istediğim tam olarak böyle bişey.

mufitsozen

#8
sayin @yamak en kolay sekilde bir character device driver yazarak baslayabilirsiniz.

http://appusajeev.wordpress.com/2011/06/18/writing-a-linux-character-device-driver/

"Testing The Driver" paragrafinda sizin istediginiz gibi bir kucuk testde yapilmis. Ornek device driverda gelen character string tersine cevriliyor.

echo "hola" > /dev/myDev 
cat /dev/myDev



yazilinca ekrana
aloh


cikiyor.

Tabii Qnx icin o  sistemde device driver yazmak nasil yapiliyor ona bakmak lazim.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

yamak

Alıntı yapılan: mufitsozen - 20 Şubat 2013, 15:23:37
sayin @yamak en kolay sekilde bir character device driver yazarak baslayabilirsiniz.

http://appusajeev.wordpress.com/2011/06/18/writing-a-linux-character-device-driver/

"Testing The Driver" paragrafinda sizin istediginiz gibi bir kucuk testde yapilmis. Ornek device driverda gelen character string tersine cevriliyor.

echo "hola" > /dev/myDev 
cat /dev/myDev

Teşekkür ederim hocam.İsteğim olay tam olarak buydu.


yazilinca ekrana
aloh


cikiyor.

Tabii Qnx icin o  sistemde device driver yazmak nasil yapiliyor ona bakmak lazim.

yamak

Teşekkür ederim hocam.mufitsozen hocamın verdiği linkteki örneği bi uygulamaya çalışayım.Takıldğım yerlerden yine başınızı ağırtırım :)