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
Anmeldungsdatum: 30. Juli 2008
Beiträge: 2669
Wohnort: Hamburg
|
|
Niualj
(Themenstarter)
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
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)
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)
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
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 28957
Wohnort: WW
|
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
Anmeldungsdatum: 2. November 2004
Beiträge: 6339
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)
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:(
|