Почему следующая команда оболочки работает, когда выполняется непосредственно в командной строке, но не работает, когда она выполняется через программу C с использованием popen / system? - PullRequest
0 голосов
/ 27 сентября 2019

Команда: ps -c -p | tr -s " " | cut -d " " -f 2,6-10,13 | grep 'R'

Я запускаю ее через оболочку adb.По сути, мне нужен список процессов (и определенных параметров), которые в данный момент находятся в очереди выполнения.Это работает нормально, если я запускаю его непосредственно через оболочку.

Однако, если я помещаю его в программу на C и кросс-компилирую для запуска на Android, он не работает.Работает только ps -c -p (я проверял это).Но при запуске этого ps -c -p | tr -s " " | cut -d " " -f 2,6-10,13 | grep 'R' я получаю вывод:

usage: tr [-cds] SET1 [SET2]

Translate, squeeze, or delete characters from stdin, writing to stdout

-c/-C  Take complement of SET1
-d     Delete input characters coded SET1
-s     Squeeze multiple output characters of SET2 into one character

tr: Needs 1 argument
usage: cut OPTION... [FILE]...

Print selected parts of lines from each FILE to standard output.

-b LIST select only these bytes from LIST.
-c LIST select only these characters from LIST.
-f LIST select only these fields.
-d DELIM    use DELIM instead of TAB for field delimiter.
-s  do not print lines not containing delimiters.
-n  don't split multibyte characters (Ignored).

cut: Needs -fcb

Я думаю, что вывод ps -c -p не передается tr, который не передает его cut.Подскажите, пожалуйста, в чем проблема?

Вот код, который я использую:

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <string.h>

    #define BUFSIZE 128

    int main(int argc,char **argv)
    {
        char *cmd4 = "ps -c -p | tr -s " " | cut -d " " -f 2,6-10,13 | grep 'R'";    
        system(cmd4);

        FILE *fp;


        char buf[BUFSIZE];
     // Another method
    if ((fp = popen(cmd4, "r")) == NULL) {
        printf("Error opening pipe4!\n");
        return -1;
    }

    while (fgets(buf, BUFSIZE, fp) != NULL) {
        // Do whatever you want here...
        printf("cmd 4 running!");
        printf("OUTPUT: %s", buf);
    }

    if(pclose(fp))  {
        printf("Command not found or exited with error status4\n");
        return -1;
    }

    return 0;
}

1 Ответ

2 голосов
/ 27 сентября 2019

В оболочке вы используете следующую команду:

ps -c -p | tr -s " " | cut -d " " -f 2,6-10,13 | grep 'R'

В C вы передаете следующее system (и позже popen):

ps -c -p | tr -s  | cut -d  -f 2,6-10,13 | grep 'R'

Видите разницу?Кавычки должны быть экранированы в исходном коде C.Кроме того, когда у вас возникают подобные проблемы, обязательно выведите соответствующие данные, чтобы вы могли видеть, что на самом деле происходит, а не то, что вы запланировали.Простой puts(cmd4) показал бы это мгновенно.

...