Kann mir jemand den Schreibmodus von popen() erklären?
Frage
Hier möchte ich einen Befehl ausführen und muss nach der Ausführung des ersten Befehls Eingaben für diesen Befehl vornehmen.
ich möchte ausführen obex_test
Befehl für den Bluetooth -Modus als nach dem Angeben von Eingaben wie 's' zum Starten des Servers, wie kann ich dieses Ding geben?Hier ist mein Code. Ich schreibe dieses Ding und bekomme eine Ausgabe.Ich habe nach der Ausführung einen Fehler bei den Eingabedaten erhalten obex_test
Befehl.
Code:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
void main() {
char *input = "obex_test -b";
FILE *fp = NULL;
char path[512];
fp = popen(input, "w");
if (fp == NULL)
{
printf("\nFailed command\n");
return;
}
else
{
printf("\nSuccesss command\n");
}
printf("starting while : %d", fp);
while (fgets(path, sizeof(path) - 1, fp) != NULL) {
printf("\nOutput ::: %s \n", path);
}
printf("\nEnd\n");
/* close */
pclose(fp);
}
Ausgabe :
Successs command
starting while : 69640
End
Using Bluetooth RFCOMM transport
OBEX Interactive test client/server.
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
> Unknown command
From Ausgabe nach dieser Zeile OBEX Interactive test client/server.
Ich muss das Eingabezeichen „s“ eingeben, aber ich kann das nicht direkt machen, es geht in eine Endlosschleife und druckt >Unknown command
.
Lösung
Oh, wenn Sie dem Popen-Befehl über Ihre C-Datei Eingaben geben möchten, dann versuchen Sie es auf diese Weise
fputc ( 's', fp );
fputc ( '\n', fp);
Wenn Sie eine Option angeben möchten, schreiben Sie hier 's'
fp ist der Dateizeiger von popen()
es funktioniert gut
in deinem Code:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
void main() {
char *input = "obex_test -b";
FILE *fp = NULL;
char path[512];
fp = popen(input, "w");
if (fp == NULL)
{
printf("\nFailed command\n");
return;
}
else
{
printf("\nSuccesss command\n");
}
//giving s option to menu
fputc ( 's', fp );
fputc ( '\n', fp);
printf("starting while : %d", fp);
while (fgets(path, sizeof(path) - 1, fp) != NULL) {
printf("\nOutput ::: %s \n", path);
}
printf("\nEnd\n");
/* close */
pclose(fp);
}
Bearbeiten:zu überwinden for Endlosschleife
Geben Sie jedes Mal zwei neue Zeilenzeichen ein, nachdem Sie eine Option angegeben haben
wie
//giving s option to menu
fputc ( 's', fp );
fputc ( '\n', fp);
fputc ( '\n', fp);
Andere Tipps
Wenn Sie Zeichen übergeben möchten (Standardoptionen), können Sie fputc oder noch besser verwenden. fputs
#include <stdio.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
FILE *fp = popen("/path/to/yourBinary cmdLineArgs", "w");
if (fp == NULL)
{
printf("Failed to open the pipe\n");
}
else
{
// Option1: pass in character, by character
fputc('n', fp);
fputc('\n', fp);
// Option2: provide 's' to the binary with the new line
fputs("s\n", fp);
// fputs allows multiple characters
fputs("4096M\n", fp);
pclose(fp);
}
return 0;
}