C 我可以从进程本身终止进程吗?
我有一些在进程终止时执行的代码,我是否可以调用C 我可以从进程本身终止进程吗?,c,unix,process,C,Unix,Process,我有一些在进程终止时执行的代码,我是否可以调用kill(getpid())来强制执行此代码(并明显地关闭进程)?尝试退出-简单得多-为什么要让事情变得复杂 我怀疑您的设计选择存在更大的问题 如果要在进程终止时执行某些代码,请在atexit中注册代码 也就是说,是的,您可以使用kill(getpid(),sig)向自己的进程发送一个信号。您可以通过以下方式使用kill调用自己的进程: kill(getpid(),SIGINT); 有关更多信息,请参阅 这与exit()命令的效果类似 是的,你可以
kill(getpid())
来强制执行此代码(并明显地关闭进程)?尝试退出
-简单得多-为什么要让事情变得复杂 我怀疑您的设计选择存在更大的问题
如果要在进程终止时执行某些代码,请在atexit
中注册代码
也就是说,是的,您可以使用kill(getpid(),sig)向自己的进程发送一个信号。您可以通过以下方式使用kill调用自己的进程:
kill(getpid(),SIGINT);
有关更多信息,请参阅
这与exit()命令的效果类似
是的,你可以。它甚至有一个特定的函数——尽管
kill(getpid(),sig)
也可以工作。您可以使用kill(getpid(),SIGSPEC)来正确地执行代码,该代码实际上是作为SIGSPEC指定的任何特定信号的信号处理程序安装的
当然,您不能捕获SIGKILL或SIGSTOP,因为它们不能有处理程序。所有其他信号都可以使用信号代码安装处理程序
如果处理程序代码不是信号处理程序,而是atexit处理程序,则只能通过exit()调用调用它。请注意,_exit()调用会绕过所有atexit处理程序
此外,我在这里看到一些评论,它们似乎暗示kill(getpid(),SIGSPEC)与_exit()或exit()相同,而事实并非如此!它们是不同的东西
我的建议是阅读exit(3)\u exit(2)signal(7)signal(2)raise(3)sigaction(3)手册页以获得完整的理解。进程可以通过以下方式自毁:
kill(getpid(),SIGKILL) 如果只
exit()
,不是更容易吗?难道不能在其中添加一个函数,在退出之前调用要执行的代码,然后调用exit()
?因为你需要先处理这些代码。另一种方法可能包括使用我在问题中写的,因为我通过信号处理一些代码,我想使退出代码标准化,通过kill终止过程中有任何问题吗?你可以给出一个退出代码。只需使用信号处理进行整理,然后使用状态代码退出。至少有一种情况不需要使用exit()
:在fork
之后,孩子尝试exec
另一个程序,但失败(无论出于何种原因)。在子进程中调用exit
会导致执行由在_exit
上安装的例程,这会导致不必要的副作用,因为只有父进程应该做这些事情(例如关闭数据库连接)。这不是设计,而是修复设计更改的解决方法。这是一种设计选择。如果你必须创建一个这样的解决方案,你应该重新检查你最初的设计选择。这是一些没有被要求的东西,这就是为什么我想到这个解决方案,但是他们在另一次改变了主意,我不得不改变很多事情,我将介绍一个向您自己发送SIGINT
的用例,例如,当您在调试器中运行应用程序时,在断言宏中。当断言失败时,调试器将变为活动状态,您可以检查调用堆栈、变量值等。我想指出,kill(getpid(),SIGINT)与exit()的效果不同。与exit()不同,提升SIGINT会将进程控制转移到任何已注册的处理程序,它还可能导致一个核心转储文件——列举exit()和引发SIGINT之间的一些差异。@AhmedMasud这就是为什么链接中的文本表示相似和不相同(“相同”表示它们完全相同,没有差异,“相似”表示它们几乎相同,但有一些细微的差异)我今天才注意到这个新答案,但我认为它更好。请注意:如果您在多线程环境中使用它,并且希望向信号处理线程发送信号,则raise(sig)
将无法工作,因为。手册页声明:raise()函数向调用进程或线程发送信号。在单线程程序中,它相当于kill(getpid(),sig)
在多线程程序中,它相当于pthread\u kill(pthread\u self(),sig)
如果该信号导致调用处理程序,则raise()将仅在信号处理程序返回后返回。