Команды подпроцесса в переполнении стека

У меня есть две программы на C ++: Program1 и Program2. Я хочу, чтобы Program1 запустила свой алгоритм для вычисления того, что ему нужно, а затем направила всю эту рассчитанную информацию в Program2, чтобы позволить ей запустить свой алгоритм, используя выходные данные Program1.

Было бы хорошо, если бы я мог просто передать информацию и закрыть Program1, не дожидаясь, пока Program2 завершит работу первым. Это было бы что-то вроде subprocess.call () в питоне.

2

Решение

Вы хотите сделать что-то вроде этого:

#include <unistd.h>

int main () {
// Do stuff for program1
int pipefds[2];
if (pipe (pipefds))
throw 1;
// Use ``write'' to send binary data to pipefds[0]
dup2 (pipefds[1], 0);
execl (/* Put the program2 arguments you want here. */);
return 1;
}

При этом все, что вам нужно, — это чтобы программа2 прочитала все необходимые данные из стандартного ввода, и все готово.

2

Другие решения

Подражать subprocess.check_call("Program1 | Program2", shell=True) Вызов Python, вы можете использовать system(3) в С:

/** $ gcc simple-pipe-system.c && ./a.out */
#include <stdlib.h>

int main(void) {
return system("Program1 | Program2");
}

Вот как подражать Program1 | Program2 трубопровод с низким уровнем труба (2) / вилка (2) / execlp (2) в C для сравнения:

/** $ gcc simple-pipe.c && ./a.out */
#include <sys/types.h> /* pid_t */
#include <unistd.h>

int main(void) {
int fd[2]; /* pipe ends */
pid_t pid = -1;

if (pipe(fd) == -1)
Report_error_and_exit("pipe");

if ((pid = fork()) == -1)
Report_error_and_exit("fork");
else if (pid == 0)  {
/* child: run Program1, redirecting stdout to the pipe */
is_child = 1;
Close(fd[0]); /* close unused read end of the pipe */

/* redirect stdout */
Redirect(fd[1], STDOUT_FILENO);

/* run Program1 with redirected stdout */
execlp("Program1", "Program1", NULL);
Report_error_and_exit("execlp");
}

/* parent: run Program2, redirecting stdin to the pipe */
Close(fd[1]); /* close unused write end of the pipe */

/* redirect stdin */
Redirect(fd[0], STDIN_FILENO);
/* run Program2 with redirected stdin */
execlp("Program2", "Program2", NULL);
Report_error_and_exit("execlp");
}

где Report_error_and_exit, Close, Redirect можно определить как:

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

#include <unistd.h>

#define Close(FD) do {                                          \
const int Close_fd = (FD);                                  \
if (close(Close_fd) == -1)                                  \
fprintf(stderr, "%s:%d: close(" #FD ") %d: %s\n",         \
__FILE__, __LINE__, Close_fd, strerror(errno));       \
}while(0)

#define Report_error_and_exit(msg) do {                       \
fprintf(stderr, "%s:%d: %s: %s\n", __FILE__, __LINE__,    \
(msg), strerror(errno));                              \
(is_child ? _exit : exit)(EXIT_FAILURE);                  \
} while(0)
static int is_child = 0;

#define Redirect(FROM, TO) do {            \
const int from = (FROM);               \
const int to = (TO);                   \
if (from != to) {                      \
if (dup2(from, to) == -1)            \
Report_error_and_exit("dup2");     \
else                                 \
Close(from);                       \
}                                      \
} while(0)
2

По вопросам рекламы [email protected]