gpt4 book ai didi

c - 调用函数 popen 中断进程

转载 作者:行者123 更新时间:2023-11-30 15:01:28 24 4
gpt4 key购买 nike

我需要实现一个子进程来执行一个文件并发送执行结果,两个进程将与共享内存段进行通信。

我的问题是我想在 10 秒后终止调用 popen 的子进程,但函数 popen 忽略信号。

这是我的代码(不包括共享内存段):

void kill_child(int sig)
{
kill(child_pid,SIGKILL);
printf("processus killed \n");

}

/*code....*/

signal(SIGALRM,(void (*)(int))kill_child);

if(fork()==0){
res.buffer=true;
FILE * fd;
char cmd[BUFFER_SIZE],output[BUFFER_SIZE];
strcpy(cmd,"./");
strcat(cmd,res.filepath);
system(cmd);
if((fd=popen(cmd,"r"))== NULL)
exit(1);
else
res.status=200;


strcpy(output,"");
while(fgets(buf,sizeof(buf)-1,fd))
strcat(output,buf);

if(pclose(fd))
exit(1);

strcat(res.customHTML,output);
res.buffer=true;


int err = sendResponse(res,args->client_fd);
if (err < 0) on_error("failed!\r\n");



exit(0);


}

else{

int status;
alarm(10);
waitpid(-1,&status,0);
printf("status %d _n);
}

如何让子进程可中断?

谢谢

最佳答案

首先,您需要将子 PID 实际存储到 child_pid 中。它是从父进程的 fork 返回的,因此将 fork 调用更改为

child_pid = fork();
if(child_pid == 0)
{
...

否则你对kill的调用将被传递一个随机值。幸运的是,它似乎默认为 0,kill 意味着杀死同一进程组中的所有进程,因此您的子进程将被杀死。

其次,不要调用 popen(),而是使用(例如)execvp() 自己调用可执行文件,并让父级使用您自己创建的管道读取输出...

int fds[2];

pipe(fds);
child_pid = fork();
if(child_pid == 0)
{
char *cmd[]={"mycmd",NULL};

/* Replace stdout with the output of the pipe and close the original */
dup2(fds[1],1);
close(fds[0]);
close(fds[1]);
execvp(cmd[0],cmd);
}
else
{
close(fds[1]);
alarm(10);
while(...)
{
read(fds[0],....);
if(waitpid(child_pid,&status,WNOHANG))
{
....
}
}
}

这样,您就只有一个正在运行可执行文件的子进程,并且您可以了解它何时以及如何退出。

关于c - 调用函数 popen 中断进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com