Archiv verlassen und diese Seite im Standarddesign anzeigen : hilffffee ... mistvariable....
hallo zusammen, ich bin mit meinem Problem-skript schon ein wenig weitergekommen. jetzt habe ich das problem, dass er die variable zwar liest, aber nicht richtig an system() weitergibt ( das ganze in gtk ). Auszug aus dem Prog:
gint on_mount_click (GtkWidget *widget, GdkEvent *ereignis, gpointer datum)
{
gchar *buf;
buf = gtk_editable_get_chars (GTK_EDITABLE (text), 0, -1);
//g_print("linuxsms -name:boris -sms:\"%s\"", buf );
so, er liest den text nach buf. wenn er jetzt den g_print ausführt ist alles ok ( nur wie kriege ich ihn dazu noch ein RETURN zum aussführen anzuhängen ? ).
ersetze ich g_print mit system sendet er mir als text der sms "%s"
ich habe mir den thread "System() mit variable ausführen" durchgelesen. übernehme ich die methode mault er mir beim compilieren undeclared.....
es muss doch möglich sein diese variable übergeben zu können ?!?!
vielen dank im voraus
gruss
boris
anda_skoa
02-10-2002, 11:48
Ich kenne g_print nicht, aber wenn das ähnlich wie printf funktiniert, mßt du für ein newline nur \n hinten im String stehen haben.
Ciao,
_
hi anda_skoa,
hast recht mit \n , brachte nur leider nicht den von mir gewünschten erfolg.
es wäre toll wenn mir jemand die umsetzung von :
char cline[128]={'\0'};
char line[128]="http://www.google.de";
sprintf(cline,"wget %s\n",line);
(aus einem anderen thread) in gtk erklären könnte
gruss
boris
hi timon,
ich habe zwar keine ahnung in perl, aber versuchs doch mal mit '\r' (Carrige Return) oder '\r\n' (Carrige Return u. LiNe feed) oder anders herum, den meines achtens ist das eine sache des terminals, mit dem du arbeitest.
hnzi
hi hnzi,
danke für den tip, \r ist zwar als schalter zulässig, bringt aber nicht das gewünschte ergebnis. ich habe glaube ich den falschen ansatz. führe ich das proggi aus sieht es wie folgt aus:
[root@host skripte]# ./wsms (das prog)
"hier jetzt die g_print-ausgabe"
[root@host skripte]#
er führt die ausgabe nicht als befehl aus, weil diese blöde variable (s.o.) nicht ans system übergeben werden kann.:confused:
trotzdem danke
gruss
boris
The Ripper
02-10-2002, 18:17
wsms liest die nachricht von der standardeingabe? dann musst du statt system fork() und exec() (oder besser: execlp()) verwenden, wobei du noch die standardeingabe von wsms mit einer pipe verbinden musst :D
hört sich alles ziemlich kompliziert an, isses aber garnicht mal, ein beispiel folgt in kürze
@the ripper da freue ich mich ja schon aufs beispiel :) nur nochmal zum ablauf:
wsms ist ein gtk programm , in welches ich text eingeben kann. dieser text wird als variable buf "gespeichert" und soll dann (wenn ich auf den button senden drücke ) an das programm linuxsms weitergegeben werden. die syntax für linuxsms ist "normalerweise" :
linuxsms -name:boris -sms"text"
und da haperts . ich bekomme ihn nicht dazu die variable buf anstelle von "text" zu setzen.
(die sache mit g_print habe ich nur gemacht um zu sehen ob die variable buf auch wirklich den text enthällt die ich eingebe)
trotzdem bin ich gespannt auf das beispiel ( sorry, es hört sich echt kompliziert an )
gruss
boris
The Ripper
02-10-2002, 18:39
so, hier das versprochene beispiel:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
pid_t child_pid;
int pipedes[2];
/* Pipe öffnen, diese wird zur Kommunikation mit dem externen Programm benötigt. */
if (pipe(pipedes) != 0)
{
perror("pipe");
exit(1);
}
/* Kindprozess starten
fork() "teilt" den aktuellen Prozess in Vater- und Kindprozess,
die gleichzeitig ausgeführt werden. */
if ((child_pid = fork()) == -1)
{
perror("fork");
exit(1);
}
if (child_pid == 0)
{
/* fork() gibt 0 an den Kindprozess zurück */
/* Jetzt erstmal die Standardeingabe umleiten... */
close(pipedes[1]); // wir verwenden nur den Eingabekanal
dup2(pipedes[0], 0); // Eingabekanal der Pipe = stdin
/* Nun wird das andere Programm gestartet.
Parameter 0 und 1 sind der Name des Programms, die restlichen Parameter werden an das aufgerufene Programm übergeben
Am Ende der Parameterliste MUSS NULL stehen. */
printf("Kind: Starte externes Programm...");
execlp("sort", "sort", NULL);
/* Wenn exec() erfolgreich ist, kehrt die Funktion nicht mehr zurück,
d.h. alles ab hier wird nur ausgeführt, wenn das andere Programm
nicht gestartet werden konnte. */
perror("exec");
_exit(2);
} else {
FILE *ausgabe;
int status;
/* Der Elternprozess bekommt die PID des Kindprozesses mitgeteilt. */
printf("Vater: Der Kindprozess hat die PID %d\n", child_pid);
/* Wir brauchen den Eingabekanal der Pipe nicht */
close(pipedes[0]);
/* Jetzt öffnen wir den Ausgabekanal der Pipe mit der Stream-E/A */
ausgabe = fdopen(pipedes[1], "w");
if (ausgabe == NULL)
{
perror("fdopen");
exit(1);
}
/* Wir füttern den Kindprozess (= dem externen Programm) nun mit ein paar Daten */
fputs("Zürich\n", ausgabe);
fputs("Berlin\n", ausgabe);
fputs("Karlsruhe\n", ausgabe);
fputs("Wien\n", ausgabe);
/* Jetzt schliessen wir auch den Ausgabekanal, damit der Kindprozess die Daten verarbeiten kann */
fclose(ausgabe);
close(pipedes[1]);
/* Hier kann der Elternprozess machen was er will,
in diesem Beispiel wird nur auf den Kindprozess gewartet */
waitpid(child_pid, &status, 0);
printf("Vater: Der Kindprozess wurde mit Code %d beendet.\n", status);
}
return 0;
}
€: hmm, ich schau mir dieses linuxsms lieber mal an :D
@the ripper danke erstmal , ich lese mich mal in dein proggi ein *stöhn*. ich habe mir für linuxsms schon ein proggi fürs bash geschrieben. da funtzt das alles easy:
nachdem der namer & der text eingelesen wurde reicht der aufruf:
linuxsms -name:$NAME -sms:"$TEXT"
und er macht was er soll.
aber ich will ja wieder alles zum klicken mit windows haben :rolleyes:
gruss
boris
The Ripper
03-10-2002, 12:43
hmm, du brauchst obiges beispiel wirklich nicht, linuxsms liest seine nachricht ja bei bedarf auch von der kommandozeile.
Dir reicht also schon folgender code (name und text wirste wohl von gtk zurück bekommen, du brauchst sie also nicht zu initialisieren)
char *command_proto = "linuxsms -name:%s -sms:\"%s\"";
char *command;
char *name = "timon";
char *text = "Hallo Timon!";
command = (char*)malloc(strlen(command_proto) + strlen(name) + strlen(text) + 1);
sprintf(command, command_proto, name, text);
system(command);
free(command);
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.