Кто-нибудь может объяснить мне popen () с режимом записи - PullRequest
4 голосов
/ 27 января 2012

Здесь я хочу выполнить одну команду, и я должен дать ввод этой команде после выполнения первой.

Я хочу выполнить команду obex_test для режима Bluetooth чем после того, как я должен дать ввод, как 's' для запуска сервера, так как я могу дать эту вещь. вот мой код, я пишу эту вещь и получил вывод. я получил ошибку ввода данных после выполнения команды obex_test.

Код:

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

}

вывод:

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

Из вывода после этой строки OBEX Interactive test client/server. Я должен дать входной символ 's', но я не могу сделать это, он идет бесконечным циклом и printf >Unknown command.

Ответы [ 2 ]

3 голосов
/ 27 января 2012

о, если вы хотите дать команду popen с помощью вашего c-файла, попробуйте этот способ

fputc ( 's', fp );
fputc ( '\n', fp);

здесь, если вы хотите задать s, напишите 's'

fp - указатель файла popen()

отлично работает

в вашем коде:

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

}

Редактировать: преодолеть за бесконечный цикл

каждый раз давать два символа новой строки после предоставления любой опции

как

//giving s option to menu
fputc ( 's', fp );
fputc ( '\n', fp);
fputc ( '\n', fp);
0 голосов
/ 08 марта 2018

Если вы хотите передать символы (параметры стандартного ввода), вы можете использовать fputc или еще лучше, 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;
}
...