Lesen aus einer Datei-Deskriptor in C
(korrigiert mich wenn ich falsch auf meine Bedingungen), So muss ich Lesen aus einem Datei-Deskriptor, aber die read-Methode in einer int für die byte-Größe zu Lesen, die viel ODER kann ich O_NONBLOCK verwenden, aber ich habe noch zum einrichten von bis zu einer Puffer-Größe von eine unbekannte Größe. was es schwierig macht. heres was ich habe, so weit
dies ist meine Methode, mit der alle die polling-und mkfifo. und N ist bereits vordefiniert in main
struct pollfd pfd[N];
int i;
for(i = 0; i < N; i++)
{
char fileName[32];
snprintf (fileName, sizeof(fileName), "%d_%di", pid, i);
mkfifo(fileName, 0666);
pfd[i].fd = open(fileName, O_RDONLY | O_NDELAY);
pfd[i].events = POLLIN;
pfd[i].revents = 0;
snprintf (fileName, sizeof(fileName), "%d_%do", pid, i);
mkfifo(fileName, 0666);
i++;
pfd[i].fd = open(fileName, O_WRONLY | O_NDELAY);
pfd[i].events = POLLOUT;
pfd[i].revents = 0;
i--;
}
while(1)
{
int len, n;
n = poll(pfd, N, 2000);
if( n < 0 )
{
printf("ERROR on poll");
continue;
}
if(n == 0)
{
printf("waiting....\n");
continue;
}
for(i = 0; i < N; i++)
{
char buff[1024]; <---i dont want to do this
if (pfd[i].revents & POLLIN)
{
printf("Processing input....\n");
read(pfd[i].fd, buff, O_NONBLOCK);
readBattlefield(buff);
print_battleField_stats();
pfd[i].fd = 0;
}
}
}
ich auch irgendwo gelesen, dass, sobald read() liest alle Daten kommen, leert sich die Leitung, was bedeutet, dass ich verwenden können, das gleiche nochmals für eine eingehende Daten. aber es ist nicht leer, das Rohr, weil ich nicht verwenden das gleiche Rohr wieder. Ich fragte meinen professor, aber alles, was er sagt, war etwas wie scanf, aber wie Sie verwenden scanf wenn scanf nimmt ein stream-DATEI, und die Umfrage.fd ist ein int? im wesentlichen meine entscheidende Frage ist, wie zu Lesen, die eingehenden Daten über den Datei-Deskriptor mit scan oder der anderen Art? mit scan wird mir helfen, mich mehr mit dem handling der Daten.
BEARBEITEN:
in einem anderen terminal, ich habe zu cat Datei - > (named_file)
und mein Hauptprogramm liest die Eingabedaten. heres, was die Eingabe der Daten sieht wie
3 3
1 2 0
0 2 0
3 0 0
ersten 2 zahlen sind der grid-Informations-und Spieler-Nummer, und nach dem raster, aber das ist eine vereinfachte version, krank werden, die den Umgang mit Größen über 100 Spieler und Netze von über 1000
- Stellen Sie den Puffer in der Größe chunk-Daten-Sie sind bereit, um zu einem bestimmten Zeitpunkt, dann behandeln Sie Sie, dass viel wiederholt. Oder wenn Sie fdopen() der fd erhalten Sie eine DATEI * und verwenden fscanf() auf, die.
- Seite Hinweis - Ihre pfd initialisaion tricks mit
i++
undi--
nicht gut aussieht. - Kannst du ein Beispiel von dem, was Ihre input-Daten Aussehen?
- du hast Recht, ich dachte, es funktionierte, aber danke für den Hinweis
- Sie sind ein Heiliger lol, Ihr diese Methoden, die ich nie wissen, dass Sie immer sparen, egal die Menge der Forschung, die ich tun, ich kann niemals stolpern die richtigen Methoden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was würdest du dann tun? Dies ist, wie es funktioniert. Dies ist nicht, wie es funktioniert:
Dieser wird kompiliert, da
O_NONBLOCK
ist eine ganze Zahl#define
, aber es ist absolut und eindeutig falsch. Das Dritte argumentread()
ist die Anzahl der zu lesenden bytes. Nicht die fahne. Zeitraum. Es kann null sein, aber was Sie hier getan haben, ist pass eine beliebige Anzahl -- was auch immer der WertO_NONBLOCK
ist, das könnte leicht sein, mehr als 1024 ist, wird die Größe des Puffers. Diese nicht das Lesen nicht-block.recv()
ist ähnlichread()
und solche flags als argument her, aber Sie nicht verwenden können, die mit einem Datei Deskriptor. Wenn Sie wollen nicht blockieren, die auf einem Datei-Deskriptor, die Sie tun müssen, es mitopen()
oderfcntl()
.Können Sie erstellen eine
FILE*
- stream von einem open-Deskriptor mitfdopen()
.Wenn Sie erreichen EOF (weil der Schriftsteller hat die Verbindung geschlossen),
read()
0 zurück, und weiter auf 0 zurück, sofort, bis jemand öffnet die pipe wieder.Wenn Sie den Deskriptor nicht-block,
read()
immer wieder sofort, wenn es jemanden gibt, angeschlossen und nichts zu Lesen, es wird -1 zurück, abererrno
wird== EAGAIN
. Sehenman 2 read
.man fifo
ist definitiv etwas, das Sie Lesen sollten; wenn es etwas gibt, die Sie nicht sicher sind, Fragen Sie eine bestimmte Frage auf der Grundlage, dass.Und nicht vergessen: Fix, dass
read()
nennen. Es ist falsch. W R O N G. Ihre prof/TA/wer nicht verpassen.read()
0 zurück, sofort sobald EOF erreicht ist (weil der writer geschlossen, die Leitung), ABER wenn ein anderer Schriftstelleropen()
s die pipe zum schreiben, wird dies zu stoppen, und Sie können weiter Lesen der neue writer.