ubuntuusers.de

Shellscript über c aufrufen?

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

Niualj

Avatar von Niualj

Anmeldungsdatum:
31. Juli 2014

Beiträge: 116

Gibt es eine möglichkeit ein Shellscript über c auf zu rufen?

Ich habe da ich kein Programm gefunden habe das direkt die Tastatureingabe auslesen kann eins selbst Programmiert was mir nach einem Tastendruck immer einen bestimmten Code ausgibt, der meistens dem ascii code entspricht, bei F1, Enter etc. natürlich einen anderen. Dieses Programm habe ich aus c un Shellscripten gebastelt wobei ich das c-Programm immer über das Shell-script aufrufen musste. Ich würde es allerdings aus verschiedenen gründen andersherum Praktischer finden.

Wenn das geht gibt es auch eine möglichkeit andere bash - Befehle über c auf zu rufen? Das Programm soll nämlich nicht aus 1000 Einzelteilen bestehen.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Z.B. mit system()

Niualj

(Themenstarter)
Avatar von Niualj

Anmeldungsdatum:
31. Juli 2014

Beiträge: 116

also könnte ich dann einfach system(bash /myshell-script.sh) eingeben und das wird dann ausgeführt?

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Niualj schrieb:

also könnte ich dann einfach system(bash /myshell-script.sh) eingeben und das wird dann ausgeführt?

Probiere es doch aus - geht schneller, als hier auf Antwort zu warten 😉

icewave

Anmeldungsdatum:
15. November 2012

Beiträge: 69

Ich weiß nicht, ob ich dich da richtig verstehe, aber wenn du in C die Tastatureingaben abfangen willst, dann gibt es mehrere Wege: Wenn der User in der Konsole ist, kannst du mit read() von der stdin Daten abrufen, ist er nicht in der Konsole musst du das Device-File auslesen und mit Keymaps arbeiten, das ist aber deutlich komplizierter.

Niualj

(Themenstarter)
Avatar von Niualj

Anmeldungsdatum:
31. Juli 2014

Beiträge: 116

Kann man das denn auch ohne Enter zu drücken? Das Device-File würde ich ja gerne auslesen wenn mir jemand sagen könnte wo man das lernen kann?

icewave

Anmeldungsdatum:
15. November 2012

Beiträge: 69

Niualj schrieb:

Das Device-File würde ich ja gerne auslesen wenn mir jemand sagen könnte wo man das lernen kann?

Siehe meinen Ansatz unter http://forum.ubuntuusers.de/topic/programm-fuer-usb-barcode-scanner-gesucht/#post-6307717. Der ist zwar auf Ziffern beschränkt, aber da lässt sich noch mehr mit machen. Die KEY_<XY> kriegst du aus den Headern.

Niualj

(Themenstarter)
Avatar von Niualj

Anmeldungsdatum:
31. Juli 2014

Beiträge: 116

Nun ja vieleicht sollte ich mich nicht übernehmen.☺ Aber kann man jetzt mit read() ohne Enter auslesen?

icewave

Anmeldungsdatum:
15. November 2012

Beiträge: 69

afaik nein.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>
#include <unistd.h>

int
main ()
{
        char buffer[1];
        read(STDIN_FILENO, buffer, 1);
        printf("%c\n", buffer[0]);

        return 0;
}

Gibt den Char erst nach Enter aus.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

wenn du unmittelbar auf einen Tastendruck reagieren willst (oder musst), dann brauchst du ein Lib, die mit Events umgehen kann.

Ich programmiere zwar nicht mit C, aber sowas gibt's bestimmt auch für C.

Gruß, noisefloor

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6596

Wohnort: Hamburg

Also das geht schon irgendwie, ohne dass man schweres Geschütz auffahren muss. Ich hatte vor einiger Zeit mal damit experimentiert, weil mein Morsezeichen Generator mal versuchsweise direkt auf Tastatureingaben reagieren sollte. Zuerst hatte ich mit ioctl() experimentiert.

Ich habe das aber wieder ausgebaut, weil es nur ein Experiment war, und besonders elegant war das wohl auch nicht. Ich poste aber mal, was von den Experimenten übrig geblieben ist und hoffe mal, das ich nicht zu viele Kommentare rausgelöscht habe. Betrachte das daher erstmal nur als einen Denkanstoß.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <termios.h>
#include <sys/ioctl.h>

#ifdef DIRECT_IO

/* terminaltest */
struct termios new_io;
struct termios old_io;

int readchar( void )
{
    int c = 0;
    int bytecounter;

    tcgetattr( STDIN_FILENO, &old_io ); /* get old attributes */
    new_io = old_io;
    cfmakeraw( &new_io );               /* set some bits */
    if( tcsetattr( STDIN_FILENO, TCSAFLUSH, &new_io ) == -1 )
        return -1;
    c = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &old_io );
    if( c == 27 )
        return -1;
    return c;
}
#endif
...

Was ich mir bei den einzelnen Sachen gedacht habe und wo ich die Anregungen her habe, kann ich momentan aber nicht sagen.

Niualj

(Themenstarter)
Avatar von Niualj

Anmeldungsdatum:
31. Juli 2014

Beiträge: 116

Naja ich kann euch ja mal sagen wie ich es mache:

#1.Über
read -r -n1 a;read -r -t0.001 b; ...
#einlesen.  

2.Dann gibt mir das C-Script den Ascii code aus 3.Dann verarbeitet das Programm den Code Damit kann ich dann Tasten außer PowerOff einlesen. Das mit read() habe ich immer noch nicht verstanden:(

Antworten |