[LINUX] [C-Sprache] Achten Sie auf die Kombination aus Puffer-API und nicht pufferndem Systemaufruf

【Überblick】

Ü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.

【Umgebung】

[root@vagrant-centos65 buff]# cat /etc/centos-release 
CentOS release 6.5 (Final)

【Code】

Es ist ein Prozess, bei dem eine Datei als Parameter übergeben und eine Zeichenfolge in diese Datei geschrieben wird.

① Mit Pufferung

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);
}
Ausführungsergebnis
[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

② Wenn keine Pufferung vorhanden ist

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);
}
Ausführungsergebnis
[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

[Zusammenfassung]

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.

【Bonus】

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);
}

Ausführungsergebnis

[root@vagrant-centos65 buff]# gcc -o no_buffer2 no_buffer2.c 
[root@vagrant-centos65 buff]# ./no_buffer2
Hello, API
Hello, system call

【Nachschlagewerk】

[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

[C-Sprache] Achten Sie auf die Kombination aus Puffer-API und nicht pufferndem Systemaufruf
So beschränken Sie die API, die in der gemeinsam genutzten Linux-Bibliothek in C-Sprache veröffentlicht werden soll
Die Geschichte der Portierung von Code von C nach Go (und zur Sprachspezifikation)
Seien Sie vorsichtig, wenn Sie die Eigenvektoren einer Matrix unterscheiden
[C-Sprache] [Linux] Ruft den Wert der Umgebungsvariablen ab
Rufen Sie die C-Funktion mit dart: ffi auf und rufen Sie die Dart-Funktion zurück
Rufen Sie die Hatena Blog API von Python aus auf und speichern Sie Ihre Blog-Artikel einzeln auf Ihrem PC
Überqueren wir die Wand des linkshändigen Koordinatensystems und des rechtshändigen Koordinatensystems.
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
100 Sprachverarbeitung Knock-42: Anzeige der Phrase der betroffenen Person und der betroffenen Person