Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.12.2011, 14:49

Konsolenausgabe eines Programms mitlesen (Linux) (C++)

Ich hab ein Programm, welches ständig recht schnell verschiedene Daten auf der Konsole ausspuckt und diese dann aber später alle x Minuten in eine Log-Datei schreibt.

Ich könnte jetzt zwar in regelmäßigen Abständen die Log-Datei durchscannen und dann dementsprechend reagieren, doch ich würde das ganze gerne schneller realisieren lassen.

Sprich mein Programm soll die Ausgabe des anderen Programms direkt mitlesen können und somit ständig up2date sein.

Doch leider habe ich überhaupt keine Ahnung wie ich da anfangen soll
?(

Zudem soll alles unter Linux laufen. Mir ist einzig die Prozess ID des Programms bekannt, dessen Ausgabe ich gerne mitlesen würde.

Edit: Ich könnte zwar versuchen herauszufinden, wo das ganze im RAM abgespeichert wird, aber es wäre weitaus schöner, wenn es eine einfachere Möglichkeit dafür gebe :S

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

15.12.2011, 14:53

für Java könnte ich dir ein wenig mehr helfen, da ich es damit schon gemacht habe
grundsätzlich solltest du aber das alte Programm vom neuen Programm starten lassen, wobei das aber auch darauf ankommt, was genau du vor hast
ansonsten würde mir noch einfallen, dass du eventuell Pipes verwenden könntest, wofür das alte Programm ggf. angepasst werden müsste
ob es andere Möglichkeiten gibt, weiß ich nicht, aber ich kann mich ja damit raus reden, dass ich mich mit C++ nicht auskenne ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

3

15.12.2011, 15:03

Den Quellcode des anderen Programms habe ich leider nicht und kann es somit nicht modifizieren =/

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

15.12.2011, 15:11

Ich bin kein Linux Guru, aber wenn du das andere Programm selbst startest, müsste sich mit fork() und pipe() was machen lassen denk ich?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

15.12.2011, 15:21

als ich die Pipes erwähnt habe, dachte ich eher an Named Pipes (Pipe Varianten - Pipes (Informatik) Wikipedia)

du weißt, dass das andere Programm auf der Standardausgabe Ausgaben tätigt
und du willst diese mit deinem eigenen Programm verarbeiten
durch eine Pipe kannst du die Ausgabe des einen Programms auf die Eingabe des anderen Programms umleiten
der Aufruf sähe dann so aus:

Quellcode

1
altes_programm parameter1 parameter2 | neues_programm evtl_paramter

dein Programm müsste dann nur noch seinen Eingabestrom auslesen
(das dürfte auch "der Unix"-Weg sein, da man so das neue Programm auch auf eine Log-Datei anwenden kann)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

6

15.12.2011, 18:16

Uff, Pipes scheinen doch nicht so einfach zu sein wie ich angenommen habe.

Könnt ihr mir da evt. paar gute Tutorials für empfehlen? (C++)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

15.12.2011, 20:04

Du kannst einfach std::cin benutzen. Wenn du Benutzereingaben behandeln kannst sollte das auch kein Problem sein. (oder hab ich was falsch verstanden?)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

16.12.2011, 00:05

Überleg dir, ob nicht eine Lösung wie von Sacaldur vorgeschlagen ausreichend ist. Dort übernimmt die Bash die Sache mit den Pipes für dich und du kannst einfach von stdin lesen.

9

16.12.2011, 10:53

Ah, ja jetzt habe ichs gepeilt und es funktioniert sogar! Größten Dank!

Nur habe ich jetzt ein neues Problem. Wenn das erste Programm nix mehr ausgibt, so gibt das zweite Programm dann ununterbrochen die ganze Zeit die letzte Ausgabe des ersten Programms aus.

Hier der Code der beiden kleinen Progs dich ich zum Testen erstellte:

output

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>

int main() {


    for(int i = 0; i < 5; i++) {
        std::cout << i << std::endl;
        sleep(1);
    }

    return 0;
}


input

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

int main() {

    int eingabe;

    do{
        std::cin >> eingabe;

        std::cout << "\n Eingabe war: " << eingabe;

    }while(true);

    return 0;
}


Aufgerufen wird das ganze mit: ./output | ./input
Ich möchte nun, dass das zweite Programm, nur dann aktiv wird, wenn das erste Programm was "neues" ausgibt. Abzufragen ob die letzte Ausgabe gleich der vorletzten Ausgabe ist, wird leider nicht gehen, da ich auch diese Information brauche.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

16.12.2011, 11:24

das liegt daran, weil dein Programm nicht auf Eingaben wartet (würde ich zumindest vermuten)

in dem Fall könntest du Eingabe am Anfang der Schleife auf einen Initialwert setzen, auf den du Eingabe danach prüfst
hat sich der WErt verändert, wurde etwas neues gelesen und du kannst damit machen, was du willst

du solltest dich aber (von Leuten, die mehr Ahnung mit C++ haben) beraten lassen, wie du es besser machen kannst
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige