уничтожьте процесс, запущенный с popen

проверь мое решение

select * from 
(
  select * from tbl_featured_professional
  order by ranking
  limit 40
)
union all
select * from 
(
  select * from tbl_featured_professional
  order by score
  limit 9999999 offset 40
)
22
задан Sophie Alpert 21 December 2013 в 04:45
поделиться

5 ответов

Не используйте popen(), запишите свою собственную обертку, которая делает то, что Вы хотели бы.

Это довольно просто к fork(), и затем замените stdin & stdout при помощи dup2(), и затем вызов exec() на Вашем ребенке.

Тот путь, Ваш родитель будет иметь точный дочерний PID, и можно использовать kill() на этом.

поиск Google "popen2 () реализация" для некоторого примера кода о том, как реализовать то, что popen() делает. Это - только приблизительно дюжина строк долго. Взятый от dzone.com мы видим пример, который похож на это:

#define READ 0
#define WRITE 1

pid_t
popen2(const char *command, int *infp, int *outfp)
{
    int p_stdin[2], p_stdout[2];
    pid_t pid;

    if (pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
        return -1;

    pid = fork();

    if (pid < 0)
        return pid;
    else if (pid == 0)
    {
        close(p_stdin[WRITE]);
        dup2(p_stdin[READ], READ);
        close(p_stdout[READ]);
        dup2(p_stdout[WRITE], WRITE);

        execl("/bin/sh", "sh", "-c", command, NULL);
        perror("execl");
        exit(1);
    }

    if (infp == NULL)
        close(p_stdin[WRITE]);
    else
        *infp = p_stdin[WRITE];

    if (outfp == NULL)
        close(p_stdout[READ]);
    else
        *outfp = p_stdout[READ];

    return pid;
}

NB: Кажется, что popen2 () - то, что Вы хотите, но мое распределение, кажется, не идет с этим методом.

26
ответ дан 29 November 2019 в 04:51
поделиться

popen на самом деле не запускает поток, а скорее разветвляет процесс. Поскольку я смотрю на определение, не похоже, что существует простой способ получить PID того процесса и уничтожить его. Могли бы быть трудные пути как исследование дерева процесса, но я предполагаю, что Вы были бы более обеспечены с использованием канала, ветвления и исполнительных функций для имитации поведения popen. Затем можно использовать PID, который Вы получаете от ветвления () для уничтожения дочернего процесса.

4
ответ дан 29 November 2019 в 04:51
поделиться

На самом деле, если процесс делает ввод-вывод (которым это должно быть, иначе почему popen вместо system (3)?), затем pclose должен бить его с SIGPIPE в следующий раз, когда это пытается читать или записать, и это должно упасть приятно :-)

3
ответ дан 29 November 2019 в 04:51
поделиться

Очевидным путем является система ("pkill process_name");

Очевидно это проблематично, если у Вас есть больше чем один экземпляр выполнения процесса.

0
ответ дан 29 November 2019 в 04:51
поделиться

Я сделал что-то подобное в Python, где Вы могли уничтожить подпроцесс и любые подпроцессы, разветвленные для этого. Это подобно решению slacy на самом деле. http://www.pixelbeat.org/libs/subProcess.py

0
ответ дан 29 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

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