Выполняйте другие задачи во время выполнения команды system () - PullRequest
2 голосов
/ 13 февраля 2010

У меня есть эта программа на С ++, которая выполняет простой пинг по указанному IP-адресу. Я не в сети, поэтому я просто использую команду system () в c ++ для выполнения ping из оболочки и сохранения результатов в файле, это легко.

Проблема в том, что я хочу, чтобы некоторые точки выводились на экран во время выполнения команды system (). я пробовал с:

while(system(cmd))
{ 
//execute the task here
}

но безуспешно. Я думаю, что я должен создать темы или что-то.

Вы можете мне помочь? Что именно я должен сделать, чтобы сделать это так, как я хочу?

Ответы [ 4 ]

8 голосов
/ 13 февраля 2010

Проблема с system заключается в том, что он приостанавливает выполнение до завершения. В системах Unix вам нужно будет использовать последовательность fork, execv, dup2 и pipe. Это позволит вам сделать что-то более полезное. См. http://docs.linux.cz/programming/c/unix_examples/execill.html для примера.

5 голосов
/ 13 февраля 2010

Вам нужно создать раздвоенный процесс, используя fork, как это, и используя popen, чтобы прочитать входные данные из вывода команды ping google.com и обработать его соответствующим образом. Есть интересное руководство от Beej по пониманию механизмов IPC, которое включено в пример кода ниже ...

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void)
{
    pid_t pid;
    int rv;
    FILE *ping;
    char buf[2000];
    switch(pid = fork()) {
    case -1:
        perror("fork");  /* something went wrong */
        exit(1);         /* parent exits */

    case 0:
        // We're the child
        ping = popen("ping google.com", "r");
        if (ping != NULL){
            fgets(buf, sizeof(buf), ping);
            pclose(ping);
            rv = 0;
        }else{
            perror("popen failed");
            rv = -1;
        }
        exit(rv);
    default:
        // We're the parent...
        wait(&rv);
    }
    // Now process the buffer
    return 0;
}

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

2 голосов
/ 13 февраля 2010

Редактировать Принимая во внимание, я считаю, что popen - это способ использовать или не выводить из cmd.


Старые

Возможно, вы ищете что-то в семействе команд wait (2), плюс форк и exec.

со страницы руководства

Функция wait () приостанавливает выполнение вызывающего процесса до Информация stat_loc доступна для завершенного дочернего процесса или сигнал получен. По возвращении из успешного вызова wait () область stat_loc содержит информацию о завершении процесса, который выход, как определено ниже.

Или, если cmd возвращает некоторую информацию о прогрессе, которую вы хотите popen (3), которая обсуждается в ряде существующих вопросов SO; например, Как мне запустить внешнюю программу из C и проанализировать ее вывод? .

1 голос
/ 13 февраля 2010

Если вы работаете в системе Unix, вы можете запустить команду с символом &, чтобы указать, что она работает в фоновом режиме следующим образом: myscript &

Это запустит новый процесс отдельно от текущей программы. Вам нужно выбрать номер процесса (надеюсь, из системы, мои знания о c posix api устарели), а затем проверить его, возможно, с помощью вызова что-то вроде wait или waitpid с включенной неблокирующей блокировкой.

Это сложно для новичка - я позволю кому-то еще публиковать подробности, если все еще заинтересован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...