我正在构建一个特性,在这里我可以在vi编辑器中打开和关闭文件。我在execlp() C中使用系统调用在新的子进程的新终端窗口中打开文件。以下是它的外观:
void openFile (char *fileName) {
int pid=fork();
if (pid==0){
execlp("gnome-terminal", "gnome-terminal", "--", "vi", fileName, NULL) ;
}
insert(fileName, pid);
return;
}因此,为了关闭文件,我有子进程Id。
void closeProcess (int pid){
printf("killing %d\n", pid);
kill(pid, SIGKILL);
return;
}现在的挑战是,这个进程id与vi编辑器进程id不一样。终止此进程并不意味着关闭vi编辑器。
下面是一些示例过程。我在pid变量中的进程id是25803,但现在已经死了。要杀死vi编辑器,我需要进程id 25815。

如何杀死vi进程。

下面是我当前的程序输出,它不关闭该文件的vi编辑器。

发布于 2022-09-13 18:35:07
我怎么才能杀死终端机的窗户和vi?
在fork()和execlp()之间,您需要设置一个进程组id。然后在杀人时,使用组号。
int setpgid(0, 0);当这在子中被调用时,前0是"me“的缩写。第二个0是“使用pid”的缩写。因此,这意味着“创建一个新的过程组,并将我放到该组中。”
杀人时,使用你一直使用的PID。但它也将处理该团体的所有儿童。
如何获得给定进程的进程组ID?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
int pid = 20989; // That PID has a PGID of 20988
int pgid = getpgid(pid);
printf("pgid = %d\n", pgid);
}或者,您可以使用以下ps命令:
ps xao pid,ppid,pgid,sid,command为什么我要避免使用SIGKILL?
杀死信号指示Linux立即结束作业。任何打开的文件都已就位关闭。应用程序没有清理用户土地状态。
或者,发送SIGTERM指示应用程序结束。允许应用程序关闭所有文件,保存它们的状态,并准备结束。
https://stackoverflow.com/questions/73643572
复制相似问题