Überprüfen Sie das Ausgabeergebnis des Aufrufs der API, die die Zeichenfolge in dem Programm puffert, das sie zuerst in die Datei schreibt, und dann den Systemaufruf, der nicht puffert. Da die API puffert, wird zuerst die vom Systemaufruf ausgegebene Zeichenfolge ausgegeben.
[root@vagrant-centos65 buff]# cat /etc/centos-release
CentOS release 6.5 (Final)
Es ist ein Prozess, bei dem eine Datei als Parameter übergeben und eine Zeichenfolge in diese Datei geschrieben wird.
buffer.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
FILE *f;
char *apiStr = "Hello, API\n";
char *systemCallStr = "Hello, system call\n";
if((f = fopen(argv[1], "w")) == NULL) {
puts("fopen error");
exit(1);
}
//Eingaben werden gepuffert
fputs(apiStr, f);
//Das Schreiben des Systemaufrufs wird nicht gepuffert und daher sofort ausgegeben.
if (write(fileno(f), systemCallStr, strlen(systemCallStr)) < 0) exit(1);
fclose(f);
exit(0);
}
[root@vagrant-centos65 buff]# gcc -o buffer buffer.c
[root@vagrant-centos65 buff]# ./buffer buffer.txt
[root@vagrant-centos65 buff]# cat buffer.txt
Hello, system call
Hello, API
no_buffer1.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
FILE *f;
char *apiStr = "Hello, API\n";
char *systemCallStr = "Hello, system call\n";
if((f = fopen(argv[1], "w")) == NULL) {
puts("fopen error");
exit(1);
}
//Auf Puffer setzen
//Alternativ ist fflush nach fputs in Ordnung
setbuf(f, NULL);
//Sofortige Ausgabe
fputs(apiStr, f);
//Sofortige Ausgabe
if (write(fileno(f), systemCallStr, strlen(systemCallStr)) < 0) exit(1);
fclose(f);
exit(0);
}
[root@vagrant-centos65 buff]# gcc -o no_buffer1 no_buffer1.c
[root@vagrant-centos65 buff]# ./no_buffer1 no_buffer1.txt
[root@vagrant-centos65 buff]# cat no_buffer1.txt
Hello, API
Hello, system call
Sie können frei zwischen dem Dateideskriptor und FILE wechseln, aber es scheint, dass Sie die beiden nicht einfach mischen sollten, da die Eingabe- / Ausgabereihenfolge je nach Puffer möglicherweise nicht in der richtigen Reihenfolge ist.
Der printf sollte gepuffert sein, aber die API wird vor dem Systemaufruf gedruckt. [Ergänzung] Aus dem Kommentar von angel_p_57
Ausgabestreams, die auf Endgeräte verweisen, werden standardmäßig immer zeilenweise gepuffert
no_buffer2.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char *apiStr = "Hello, API\n";
char *systemCallStr = "Hello, system call\n";
printf("%s", apiStr);
if (write(STDOUT_FILENO, systemCallStr, strlen(systemCallStr)) < 0) exit(1);
exit(0);
}
[root@vagrant-centos65 buff]# gcc -o no_buffer2 no_buffer2.c
[root@vagrant-centos65 buff]# ./no_buffer2
Hello, API
Hello, system call
[Normale Linux-Programmierung 2. Ausgabe: Der königliche Weg der gcc-Programmierung, der aus dem Mechanismus von Linux gelernt werden kann](https://www.amazon.co.jp/%E3%81%B5%E3%81%A4%E3%81%86% E3% 81% AELinux% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83% B3% E3% 82% B0-% E7 % AC% AC2% E7% 89% 88-Linux% E3% 81% AE% E4% BB% 95% E7% B5% 84% E3% 81% BF% E3% 81% 8B% E3% 82% 89% E5 % AD% A6% E3% 81% B9% E3% 82% 8Bgcc% E3% 83% 97% E3% 83% AD% E3% 82% B0% E3% 83% A9% E3% 83% 9F% E3% 83 % B3% E3% 82% B0% E3% 81% AE% E7% 8E% 8B% E9% 81% 93-% E9% 9D% 92% E6% 9C% A8-% E5% B3% B0% E9% 83 % 8E-ebook / dp / B075ST51Y5)
Recommended Posts