首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用fork()进程id从c中删除进程?

如何使用fork()进程id从c中删除进程?
EN

Stack Overflow用户
提问于 2022-09-08 03:57:47
回答 1查看 130关注 0票数 -2

我正在构建一个特性,在这里我可以在vi编辑器中打开和关闭文件。我在execlp() C中使用系统调用在新的子进程的新终端窗口中打开文件。以下是它的外观:

代码语言:javascript
复制
void openFile (char *fileName) {
    int pid=fork();
    if (pid==0){
        execlp("gnome-terminal", "gnome-terminal", "--", "vi", fileName, NULL) ;
    }
    insert(fileName, pid);
    return;
}

因此,为了关闭文件,我有子进程Id。

代码语言:javascript
复制
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编辑器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-13 18:35:07

我怎么才能杀死终端机的窗户和vi?

fork()execlp()之间,您需要设置一个进程组id。然后在杀人时,使用组号。

代码语言:javascript
复制
int setpgid(0, 0);

当这在子中被调用时,前0是"me“的缩写。第二个0是“使用pid”的缩写。因此,这意味着“创建一个新的过程组,并将我放到该组中。”

杀人时,使用你一直使用的PID。但它也将处理该团体的所有儿童。

如何获得给定进程的进程组ID?

代码语言:javascript
复制
#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命令:

代码语言:javascript
复制
ps xao pid,ppid,pgid,sid,command

为什么我要避免使用SIGKILL?

杀死信号指示Linux立即结束作业。任何打开的文件都已就位关闭。应用程序没有清理用户土地状态。

或者,发送SIGTERM指示应用程序结束。允许应用程序关闭所有文件,保存它们的状态,并准备结束。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73643572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档