【问题标题】:creating a process and killing it创建一个进程并杀死它
【发布时间】:2012-09-28 19:56:09
【问题描述】:

我正在处理一项任务,该任务要求我创建一个子进程,然后等待 300 秒并终止该进程,而父进程应在创建子进程后 200 秒被终止。我正在使用 Clang++ 编译器在 Ubuntu 的 C++ 中执行此操作。我对 C++ 非常陌生,并且已经使用 Java 一段时间了。我现在所拥有的可能更像是伪代码而不是其他任何东西,我真的怀疑它是否有效。当我编译它给我关于我的 kill() 调用的错误时,我尝试了诸如 *this.kill() 或 this.kill() 之类的东西,但都没有奏效。如何使用 kill 命令?另外,这段代码看起来像我想要的吗?恐怕还没有接近。

#include <iostream>
#include <unistd.h>
using namespace std;

class process{

public:
    process(){
        main();
    }


    void main(){
        process *parent = new process();
        int pid;
        pid=fork();
        if (pid == 0)
        {   
            sleep(200);
            kill();
        }
        else
        {
            sleep(100);
            kill();
        }
    }   
};

【问题讨论】:

标签: c++ linux ubuntu clang


【解决方案1】:

您的代码的结构类似于 Java 命令行程序,其中主入口点是某个(非特定)类中名为 main() 的函数。 C++ 程序也使用 main() 作为入口点,但它必须是顶层函数,而不是类方法。

通常你会拥有一个最小的 C++ 程序:

int main(int argc, char *argv[])
{
    ...
    return 0;
}

在你的程序中最好避免完全创建一个类;考虑到您只是在运行一些简单的程序代码,因此没有必要。

【讨论】:

    【解决方案2】:

    kill 系统调用需要几个参数:要杀死的进程的进程 ID,以及一个特定的信号。没有没有参数的调用版本,例如直接杀死当前进程。

    查看 kill 的手册页,here's 手册页的 linux 版本。

    请注意,在 unistd.h 之前,您还可以访问 getpid 调用,您可以使用该调用来获取调用进程的进程 ID,请参阅 man getpid

    【讨论】:

      【解决方案3】:

      kill是一个向进程发送信号的系统调用,你必须指定正确的信号作为它的第二个参数(第一个是接收进程的进程id),像这样:

      kill(pid,SIGKILL);
      

      【讨论】: