проверь мое решение
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
)
Не используйте 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 () - то, что Вы хотите, но мое распределение, кажется, не идет с этим методом.
popen на самом деле не запускает поток, а скорее разветвляет процесс. Поскольку я смотрю на определение, не похоже, что существует простой способ получить PID того процесса и уничтожить его. Могли бы быть трудные пути как исследование дерева процесса, но я предполагаю, что Вы были бы более обеспечены с использованием канала, ветвления и исполнительных функций для имитации поведения popen. Затем можно использовать PID, который Вы получаете от ветвления () для уничтожения дочернего процесса.
На самом деле, если процесс делает ввод-вывод (которым это должно быть, иначе почему popen
вместо system
(3)?), затем pclose
должен бить его с SIGPIPE
в следующий раз, когда это пытается читать или записать, и это должно упасть приятно :-)
Очевидным путем является система ("pkill process_name");
Очевидно это проблематично, если у Вас есть больше чем один экземпляр выполнения процесса.
Я сделал что-то подобное в Python, где Вы могли уничтожить подпроцесс и любые подпроцессы, разветвленные для этого. Это подобно решению slacy на самом деле. http://www.pixelbeat.org/libs/subProcess.py