Hier ist ein Beispielquelltext aus meinem Buch C und Linux, in dem das Programm "sort" als "Unterprogramm" aufgerufen wird und über zwei Pipes Daten in beide Richtungen mit "sort" ausgetauscht werden:
/*
pipe2.c - Pipes als Standardein- und -ausgabe
*/
# include <stdio.h>
# include <unistd.h>
# include <sys/wait.h>
int main()
{
int fd1[2], fd2[2], l;
char buffer[80];
if ((pipe(fd1) != 0) || (pipe(fd2) != 0))
{
perror("pipe2: pipe() failed");
return(1);
}
if (fork() == 0)
{
close(fd1[1]); /* Kind-Prozess */
close(fd2[0]);
if ((dup2(fd1[0], STDIN_FILENO) == -1) || (dup2(fd2[1], STDOUT_FILENO) == -1))
{
perror("pipe2: dup2() failed");
return(1);
}
close(fd1[0]);
close(fd2[1]);
execlp("sort", "sort", NULL);
perror("pipe2: execlp() failed");
return(1);
}
close(fd1[0]); /* Eltern-Prozess */
close(fd2[1]);
write(fd1[1], "These\nlines\nshall\nbe\nsorted\n", 28);
close(fd1[1]);
wait(NULL);
if ((l = read(fd2[0], buffer, 79)) == -1)
perror("pipe2: read() failed");
else
write(STDOUT_FILENO, buffer, l);
close(fd2[0]);
return(0);
}
Martin G schrieb:
Apropos Endlosschleife:
Wusstet Ihr schon, dass der neue IBM Cell-Prozessor so schnell ist, dass er für eine Endlosschleife nur 28 Sekunden braucht?
Brennt der nach 28 Sekunden Volllast ab, oder wie macht er das?
Schau dir am besten mal GGI an. Das ist eine generische Grafik-API. Die kann svgalib, x11, framebuffer, opengl, quartz und was weiß ich noch. Dann musst du die Grafik-Sachen in deinem Programm nur einmal schreiben und der Benutzer kann sich eben auswählen, was er haben will.
Ein unter Linux kompiliertes Programm funktioniert unter Windows nicht. Der Sinn solcher Multi-Plattform Bibliotheken ist lediglich dass Du den Sourcecode nicht verändern musst, kompilieren musst Du ihn weiterhin für jede Plattform.
Du denkst falsch: pid bekommt die Child-ID und Null. Und zwar im Kindprozess Null und im Parent-Prozess die Child-ID. Bedenke dabei dass ab dem fork Dein Programm gewissermassen zweimal parallel abläuft, wobei beide Instanzen keinerlei Zugriff auf die Variablen der anderen Instanz haben (will heissen eine Änderung an pidc im Kindprozess wirkt sich auf den Elternprozess nicht aus).
Solange Du keinen zweiten Kindprozess startest, sollte es also langen, wenn Du im kill (und im printf) die Variable pid und nicht pidc verwendest.
|M| schrieb:
CStoll schrieb:
Sleep() (mit großem S) gibt's unter Windows
Würde mir jemand sagen, wo diese Funktion steht?
Wie wär's mit der MSDN?
@teddy: Plattform-übergreifend könntest du nur per busy-waiting "schlafen":
void my_sleep(unsigned int millis)
{
clock_t ticks = millis*CLOCKS_PER_SEC/1000, start=clock();
while(start+ticks!=clock());
}
Oder du wrappst je nach System auf die "richtige" Sleep-Funktion:
void my_sleep(unsigned int millis)
{
#ifdef _WIN32
Sleep(millis)
#else
usleep(1000*millis);
#endif
}
Benutz bitte vernünftige Titel und gib mehr Details über dein Problem.
Ich tippe mal, dass du einfach nur die Windows Partition einbinden musst und die Dateien dann kopieren kannst.
LordAndy1984 schrieb:
und vielleicht hab ich ja noch eine Erleuchtung dann änder ichs wieder auf char* um wenn ich mich mit den ganzen strlens, * und & zurechtfinde *g*
Lass das lieber - std::string wurde entwickelt, damit du dich nicht mehr mit "den ganzen strlens, * und &" herumärgern mußt
Danke für eure Antworten, Leute.
Hab' mich bisher noch nicht ausführlich mit der Materie beschäftigt aber die Informationen aus /proc heraus zu parsen würde ich gerne vermeiden. Das ist nämlich ein Grund meines Umstiegs von den Scriptsprachen zu C/C++.
Mein erster Versuch ist folgender (damit gebe ich mir die Netzwerkkartennamen an):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <net/if.h>
int main()
{
unsigned int nIfIndex = 22
char *pIfName = NULL;
pIfName = malloc(IF_NAMESIZE * sizeof(char));
memset(pIfName, 0, IF_NAMESIZE);
if (if_indextoname(nIfIndex, pIfName))
printf("Interface %d is %s\n", nIfIndex, pIfName);
free(pIfName);
return 0;
}
nIfIndex gibt die Nummer Netzwerkkarte an. Könnte man noch durch eine hochzählende Schleife erweitern. Bleibt die Frage wie ich das Protokoll herausbekomme? Ich suche nach Ethernetnics und keine ppp -und lo-nics. Ferner wäre noch interessant wie ich ich eine Wireless-Extension erkenne.
Für alle Infos dankbar!
Goran
RHBaum schrieb:
...und das meist sogar als sichtbare verzeichnisse (ohne . davor)
Tatsächlich? Gib mal Beispiele, ich hab da nämlich kein einziges vor Ort. (Und ich habe _viele_ Programme installiert.)