Как Вы порождаете другой процесс в C?

Я не думаю, что вы найдете способ импортировать дамп sql (который содержит несколько таблиц со ссылками), а затем выполнить произвольные SQL-запросы на них в пределах R. Это в основном требовало, чтобы пакет R запускал полный сервер базы данных (совместимый с тем, который создает дамп) в пределах R.

Я бы предложил экспортировать таблицы / select утверждения, которые вам нужны в CSV из вашей базы данных (см. здесь) . Если вы можете работать только с дампа и не хотите настраивать сервер для преобразования, вы можете использовать некоторые простые регулярные выражения, чтобы превратить операторы insert в ваш дамп в кучу CSV-файлов для таблиц, используя инструмент вы выбираете, как sed или awk (или даже R, как предложено другим ответом, но это может быть довольно медленным для этого размера файла).

27
задан Laurel 7 June 2016 в 16:21
поделиться

7 ответов

Это действительно зависит от того, что вы пытаетесь сделать, именно так:

  1. Зависит от ОС
  2. Не совсем понятно, что вы пытаетесь сделать.

Тем не менее, я постараюсь предоставить некоторую информацию для вашего решения.
В UNIX fork() создает клон вашего процесса из того места, где вы назвали fork. То есть, если у меня следующий процесс:

#include <unistd.h>
#include <stdio.h>

int main()
{
    printf( "hi 2 u\n" );
    int mypid = fork();

    if( 0 == mypid )
        printf( "lol child\n" );
    else
        printf( "lol parent\n" );

    return( 0 );
}

Вывод будет выглядеть следующим образом:

hi 2 u
lol child
lol parent

Когда вы fork(), pid, возвращаемый в потомке, равен 0, а pid, возвращаемый в родительском элементе, является pid ребенка. Обратите внимание, что "hi2u" печатается только один раз ... родителем .

execve() и его семейство функций почти всегда используются с fork(). execve() и т. П. Перезаписывают текущий стековый кадр именем приложения, которое вы передаете ему. execve() почти всегда используется с fork(), когда вы разветвляете дочерний процесс, и если вы родитель, вы делаете все, что вам нужно, и если вы ребенок, вы запускаете новый процесс. execve() также почти всегда используется с waitpid() - waitpid берет pid дочернего процесса и, буквально, ждет , пока ребенок не завершит работу, и вернет вам статус выхода ребенка.

Используя эту информацию, вы сможете написать очень простую оболочку; тот, который принимает имена процессов в командной строке и запускает процессы, которые вы ему сообщаете. Конечно, оболочки делают больше, чем, например, ввод и вывод по трубопроводам, но вы должны быть в состоянии выполнить основы, используя fork(), execve() и waitpid().

ПРИМЕЧАНИЕ. Это * * nix! Это НЕ будет работать в Windows.

Надеюсь, это помогло.

18
ответ дан FreeMemory 28 November 2019 в 04:52
поделиться

Если Вы хотите выполнить более сложные операции, как чтение вывода внешней программы, Вы можете быть лучше обслужены системный вызов popen . Например, чтобы программно получить доступ к списку каталогов (это - несколько глупый пример, но полезный как пример), Вы могли записать что-то вроде этого:

#include <stdio.h>

int main()
{
  int entry = 1;
  char line[200];
  FILE* output = popen("/usr/bin/ls -1 /usr/man", "r");
  while ( fgets(line, 199, output) )
  {
    printf("%5d: %s", entry++, line);
  }
}

для предоставления вывода как это

1: cat1
2: cat1b
3: cat1c
4: cat1f
5: cat1m
6: cat1s
...
16
ответ дан Blair Conrad 28 November 2019 в 04:52
поделиться
#include <stdlib.h>

int main()
{
    system("echo HAI");

    return 0;
}
11
ответ дан andrewrk 28 November 2019 в 04:52
поделиться

В UNIX, я думаю, вам, в основном, нужно его разветвить, если вы хотите, чтобы порожденный процесс запускался независимо от порождающего: например, если вы не хотите, чтобы ваш порожденный процесс завершался при выходе из процесса порождения.

Вот страница , которая объясняет все тонкие различия между Fork, System, Exec.

Если вы работаете с Win, Mac и Linux, я могу порекомендовать вам Qt Framework и его объект QProcess , но я не знаю, подходит ли вам этот вариант. Большим преимуществом является то, что вы сможете скомпилировать один и тот же код для Windows Linux и Mac:

 QString program = "./yourspawnedprogram";
 QProcess * spawnedProcess = new QProcess(parent);
 spawnedProcess->start(program);
 // or spawnedProcess->startDetached(program);

И, кроме того, вы можете даже убить дочерний процесс из материнского процесса и поддерживать связь с это через поток.

3
ответ дан feedc0de 28 November 2019 в 04:52
поделиться

Одним решением является системная функция, определенная в системном примере stdlib.h

int system(const char *string);

API

2
ответ дан Rippy 28 November 2019 в 04:52
поделиться

Если вам нужно проверить / прочитать / проанализировать вывод вашей внешней команды, я бы предложил использовать popen () вместо system ().

1
ответ дан mouviciel 28 November 2019 в 04:52
поделиться

Говоря о зависимых от платформы рецептах, на использовании Windows CreateProcess, на Posix (Linux, Mac) использование fork + execvp. Но system() должен удовлетворить Ваши главные потребности и часть стандартной библиотеки.

1
ответ дан Constantin 28 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: