Go如何关闭exec可执行程序
【摘要】 目录
前言
正文
一、syscall
二、cmd
信号量表
结论
前言
大家都知道go的协程操作非常灵活,但是有没有想过go如何操作进程,特别是关闭特定Pid的进程。
正文
今天向大家介绍两种使用go关闭进程的方法,话不多说直接上代码。
一、syscall
利用syscall包,具体代码请参考:
var cmd *exec.C...
目录
前言
大家都知道go的协程操作非常灵活,但是有没有想过go如何操作进程,特别是关闭特定Pid的进程。
正文
今天向大家介绍两种使用go关闭进程的方法,话不多说直接上代码。
一、syscall
利用syscall包,具体代码请参考:
var cmd *exec.Cmd
syscall.Kill(cmd.Process.Pid, syscall.SIGKILL)
其中,参数一是具体进程的PID,参数二是信号量标识。
注意:信号量标识,表明了特定的信号动作,文章在后面列出了POSIX.1-1990的一些标准定义。
二、cmd
利用cmd.Process模块,具体代码请参考:
var cmd *exec.Cmd
cmd.Process.Kill()
信号量表
POSIX.1-1990标准中定义了一些信号,具体参考如下表格:
信号 | 值 | 动作 | 说明 |
---|---|---|---|
SIGHUP | 1 | Term | 终端控制进程结束(终端连接断开) |
SIGINT | 2 | Term | 用户发送INTR字符(Ctrl+C)触发 |
SIGQUIT | 3 | Core | 用户发送QUIT字符(Ctrl+/)触发 |
SIGILL | 4 | Core | 非法指令(程序错误、试图执行数据段、栈溢出等) |
SIGABRT | 6 | Core | 调用abort函数触发 |
SIGFPE | 8 | Core | 算术运行错误(浮点运算错误、除数为零等) |
SIGKILL | 9 | Term | 无条件结束程序(不能被捕获、阻塞或忽略) |
SIGSEGV | 11 | Core | 无效内存引用(试图访问不属于自己的内存空间、对只读内存空间进行写操作) |
SIGPIPE | 13 | Term | 消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作) |
SIGALRM | 14 | Term | 时钟定时信号 |
SIGTERM | 15 | Term | 结束程序(可以被捕获、阻塞或忽略) |
SIGUSR1 | 30,10,16 | Term | 用户保留 |
SIGUSR2 | 31,12,17 | Term | 用户保留 |
SIGCHLD | 20,17,18 | Ign | 子进程结束(由父进程接收) |
SIGCONT | 19,18,25 | Cont | 继续执行已经停止的进程(不能被阻塞) |
SIGSTOP | 17,19,23 | Stop | 停止进程(不能被捕获、阻塞或忽略) |
SIGTSTP | 18,20,24 | Stop | 停止进程(可以被捕获、阻塞或忽略) |
SIGTTIN | 21,21,26 | Stop | 后台程序从终端中读取数据时触发 |
SIGTTOU | 22,22,27 | Stop | 后台程序向终端中写数据时触发 |
结论
根据实际效果验证,上述两种方法的效果是一致的。syscall换成其他信号量,效果会略有所不同,感兴趣的同学自己尝试。
文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。
原文链接:liuzhen.blog.csdn.net/article/details/110204485
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)