screen macht das glaube ich über ein unix-socket. Du hast also einen "Server", der die Sessions verwaltet und attatchst dich dann über den unix-socket mit dem client.
Vielleicht liegt's am read() oder write(). Versuch's doch mal mit den "richtigen" Funktionen send() und recv()!
Zum Testen solcher Client-Server-Programme ist es hilfreich, sich einen "Universal-Server" und "Universal-Client" zu schreiben, die einfach die empfangenen Zeichen ausgeben und die Tastatureingabe über den Socket schicken - also quasi Netzwerk-Chat-Tools. Für beides findest Du die Quelltexte in meinem Buch C und Linux.
PS.: Du solltest in Zeile 8 Deines letzten Posts exit(0) durch break; ersetzen. Dann wird die while()-Schleife und damit das Programm "sauber" beendet.
tntnet schrieb:
Du bist im falschen Forum .
Nein, nicht wirklich. Ich hab's schnell mit Cygwin getestet - also quasi unter Linux. Nur dass Cygwin halt immer ein ".exe" anhängt.
2sizeof(std::size_t) bytes. Vorher wird nur vermutlich der OOM Killer zuschlagen. Wenn du wissen möchtest wieviel physischer RAM existiert, solltest du in /proc/meminfo schauen.
Du kannst einfach Posix-Funktionen verwenden, oder eben MacOS-X-Spezifisches.
stephle schrieb:
Muss den Speicherzustand einer Festplatte herausbekommen.
Speicherzustand? Also wieviel Platz noch frei ist?
Siehe statvfs.
edit: URL korrigiert.
Hi,
ich habe ein Problem mit SSH.
Mal ein simpler Server :
#include <iostream>
#include <ctime>
#include <boost/thread/thread.hpp>
void thread_func(void){
for(unsigned int i = 0; i < 2; i++){
boost::thread t(startThread);
system("ssh localhost \' ./client \'");
}
}
int main(void){
boost::thread t(thread_func);
char c = getchar();
return 0;
}
Ein einfacher Client
Code:
#include <iostream>
#include <cstdlib>
int main(void){
while(true){
std::cout<<"while-loop \n";
sleep(2);
}
}
Über den Server will ich nun auf verschiedenen Rechner Client Prozesse starten diese verbinden sich dann mit dem Server. Wenn ich den Server Prozess beende, sollen alle SSH Verbindungen geschlossen werden und somit auch die Client Prozesse gekillt werde, wie es z.B. bei MPI ist.
Im obigen Beispiel starte ich einfach mal Client prozesse die in einer while schleife laufe, wenn ich den Server Prozess beenden, beenden sich die Client Prozesse jedoch nicht, wie kann man sowas errreichen ?
Ich glaube, Du hast den Sinn von pipe() nicht ganz verstanden.
Du erzeugst in Zeile 12 eine Pipe und benutzt diese als Standardeingabe in dem Kind-Prozess. Jedoch schreibst Du ja nichts in das andere "Ende" der Pipe (pfd[1]) hinein. Was soll Deiner Meinung nach dann aus pfd[0] herauskommen???
(Im Übrigen sagt Dir das ja auch die Fehlermeldung "broken pipe".)
Wenn Dein Programm das externe Programm "stdinToFile" aufrufen soll und die Standardeingabe an dieses weiterleiten soll, benötigst Du keine Pipe! Der execl()-Aufruf allein würde es auch tun, da mit diesem Aufruf automatisch die Standardeingabe an das aufgerufene Programm geht!
Benutze Einführungszeichen
wget "http://192.168.2.1/cgi-bin/login.cgi?your_password=geheim, meins :)"
wget "http://192.168.2.1/cgi-bin/advanced_internet.cgi?form_submission_type=normal&form_submission_parameter=&internet=disabled&multiple_pvc=disabled®istered_vpi_0=8®istered_vci_0=35®istered_comment_0=&new_vpi_manual=&new_vci_manual=&new_comment_manual="
wget
"http://192.168.2.1/cgi-bin/advanced_internet.cgi?f ....... anual=&new_vci_manual=&new_comment_manual="
du kannst auch mit -O /dev/null arbeiten, damit keine Datei unnötigerweise runtergeladen wird
Aber selbst mit -lm wirst Du den selben Fehler bekommen, da die gewünschte Funktion sqrt und nicht Sqrt heisst. C macht einen unterschied zwischen Groß- und Kleinschreibung.
Also gibt es da nicht irgendeine C++ Funktion mit der ich sowas machen kann? Ich mache ja so derzeit eine Verbindung zum Laufwerk auf:
char* dev_name = "/dev/cdrom";
int fd;
if((fd = open(dev_name, O_RDONLY | O_NONBLOCK)) < 0) {
// etwas ist schief gelaufen
}
Dann kann ich über "ioctl" Sachen mit dem Laufwerk machen (z.B. Sektoren auslesen):
if((ioctl(fd, CDROMREADAUDIO, &data)) < 0) {
// etwas ist schief gelaufen
}
Ich dachte, dass ein Block-Device Treiber wie der eines CDROM-Laufwerks ist, irgendwelche ioctls oder andere Funktion zum Abruf von Hersteller, Modell und andere Dinge wie Lesegeschwindigkeit usw. zur Verfügung stellt.
Vielleicht wird meine Situation ja jetzt klarer.
Liebe Grüße,
Thomas