• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

c++ pkg aufrufen?

Sadakazu

Well-Known Member
Themenstarter #1
Moin moin...
gibt es noch eine andere möglichkeit außer system("pkg foo bar"); mit c++ das Programm pkg aufzurufen?
 

marcel

Well-Known Member
#2
Hi @Sadakazu ,

gibt es noch eine andere möglichkeit außer system("pkg foo bar"); mit c++ das Programm pkg aufzurufen?
Es kommt darauf an, wie und ob Du mit pkg interargieren möchtest. Du kannst entweder den laufenden Prozess durch Ausführen von pkg mithilfe einer der exec*()-Funktionen ersetzen, oder einen neuen Prozess mit vfork() erzeugen, und in diesem dann eine der exec*()-Funktionen aufrufen.
 

Sadakazu

Well-Known Member
Themenstarter #3
Ich bastel mir grad ein installations programm....
momentan wird pkg über system() aufgerufen... etwa so:
Code:
std::string packages = "xorg lightdm und so weiter und so fort";
std::string command = "pkg install " + packages;
std::system(command.c_str());
Da ich jetzt fast alles im code auf POSIX geändert habe - also weg von std::system("echo 'lightdm_enable=\"yes\"' >> /etc/rc.conf"); zu nem fstream usw - würde ich natürlich auch vorziehen pkg irgendwie anders als mit system() aufzurufen.... evtl so, das ich auch noch eine rückgabe bekomme, ob pkg korrekt durchgelaufen ist
die sache mit dem:
Code:
if(std::system(command.c_str() != -1) {
    //doSomthe()
}
find ich jetzt auch nicht grad berauschend....
 

KobRheTilla

used register
#4
Ich verstehe nicht, warum du so etwas in C++ schreiben willst. Dafür sind Shellskripte wesentlich besser geeignet.

Aber um beim Thema zu bleiben: nutze fork()+exec(), den Exitcode vom Tool kannst du dann mittels waitpid() im Hauptprozess abfragen.

Rob
 

Sadakazu

Well-Known Member
Themenstarter #5
Weils ein bisschen komplexer ist was ich da gemacht habe...
Ich will halt die möglichkeit haben mir aussuchen zu können welchen Desktop ich installiere...
Also XFCE4, Gnome3, KDE4, KDE/Plasma5, Cinnamon, Mate, LXDE...
Außerdem will ich mir aussuchen können welchen Grafiktreiber ich installieren will... also AMD, Intel, Nvidia, Vbox-OSE

Zusatzsoftware... usw usf...

Ich finde es mit c++ halt übersichtlicher als mit Shellscripten...
Und außerdem ist das ganze Thema bis auf 2 Grafiktreiber komplett fertig....
Der wechsel von system(); zu irgendwas anderem wäre jetzt auch nur noch "für die Schönheit" funktionieren tuts ja auch mit system(); :P
 

Tulkas

Well-Known Member
#6
AFAIK ist pkg nur ein Frontend für libpkg. Die pkg-plist von ports-mgmt/pkg zeigt auch lib/libpkg.a und lib/libpkg.so. Demensprechend kannst du die Funktionen als lib einbinden und brauchst keine system-calls.
 

Sadakazu

Well-Known Member
Themenstarter #10
waer es hier nicht besser fuer sowas auf Puppet oder Ansible zu setzen?
Keinen schimmer.... c++ kann ich halt... mehr oder weniger....
Puppet oder Ansible kenn ich null... und um ehrlich zu sein brauch ich ein "Programm" das out of the box sofort funktioniert...
Sprich wo ich maximal ein make befehl vor setzen muss...
Ich will nicht erst 10000 Dinge installieren müssen bevor ich mein "Script" durchlaufen lassen kann.
Aus genau dem Grund würd ich auch ungern "fremd Bibliotheken" benutzen sondern lieber alles über den standard machen...
Das mit libpkg guck ich mir nachher aber noch an....
Schneller geschrieben != besser geeignet
Sehe ich ähnlich...
Zumal ich allein schon wegen der Übersich vieles in eigene Klassen auslager...
Und für jeden pups schritt nen eigenes Shellscript hab ich keine böcke zu.....
 
#11
und um ehrlich zu sein brauch ich ein "Programm" das out of the box sofort funktioniert...
Sprich wo ich maximal ein make befehl vor setzen muss...
Ich will nicht erst 10000 Dinge installieren müssen bevor ich mein "Script" durchlaufen lassen kann.
Ein Shellskript läuft grundsätzlich out of the box. Viel Spaß mit deinem Binary, wenn libpkg.so fehlt.

Rob
 

Sadakazu

Well-Known Member
Themenstarter #12
Ein Shellskript läuft grundsätzlich out of the box.
nach einer frischen installation und installation (bootstrap) von pkg ist die wahrscheinlichkeit das die lib fehlt verschwindend gering...
Und selbst wenns doch passieren sollte das die lib fehlt... funktioniert auch dein Shellscript mit pkg aufruf nicht ;)
Denn wie @Tulkas schon sagte:
AFAIK ist pkg nur ein Frontend für libpkg
Außerdem:
Ich habe kein Binary... ich habe nur den Sourcecode... Das Binary wird auf der Maschine direkt erstellt.... Sprich, wenn die lib nicht zum linken verfügbar ist, gibts auch kein Binary....
Das ist auch genau der Grund, weswegen ich "fremd Bibliotheken" vermeiden will...
Stichwort boost und co.... Deswegen schreib ich das alls mit der Standard C++ Bibliothek, die eigentlich mit einem Compiler dazu kommt... und FreeBSD wird nunmal mit einer Menge Entwickler Tools "vorinstalliert ausgeliefert"...

Außerdem, wie gesagt.. ich will nicht nur pkg ausführen über ein script, sondern ich schreibe noch eigene xorg configs (was allein schon 3 Dateien sind die NEU geschrieben werden) außerdem kommen noch etliche user configs hinzu... eine menge system configs....
Und um da die übersicht zu behalten ist - meiner meinung nach - c++ besser geeignet...

Achja... noch ein Grund warum C++ und nicht Shellscript....
Bin in C++ immernoch "Anfänger" und wenn ich mir alles immer bequem mache und mit Shellscripten arbeite (was ja durchaus machbar wäre), lerne ich nie vernünftig C++ ;)
Dient neben dem nutzen außerdem noch der übung ^^