2012-01-27 3 views
3

Здесь я хочу выполнить одну команду, и я должен дать ввод этой команде после выполнения первой.Может ли кто-нибудь объяснить мне popen() с режимом записи

Я хочу выполнить команду 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», но я не могу в состоянии сделать это direclty его идет бесконечный цикл и принтf >Unknown command.

ответ

2

ой, если вы хотите внести свой вклад в POPEN команду на диске С файл, то попробуйте этот способ

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

здесь, если вы хотите, чтобы параметр ы затем написать '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); 

} 

Edit: преодолеть цикл Infine

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

как

//giving s option to menu 
fputc ('s', fp); 
fputc ('\n', fp); 
fputc ('\n', fp); 
+0

u попытаться выполнить? – user1089679

+0

Где я это сказал? эти две линии? – user1089679

+0

Да, я подтвердил этот пример на основе меню. вы можете поместить эту строку в код ur после команды popen() и перед тем, как pclose() –

0

Если вы хотите передать символы (STDIN опции) вы можете использовать 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; 
}