Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我可以从进程本身终止进程吗?_C_Unix_Process - Fatal编程技术网

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()将仅在信号处理程序返回后返回。