当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [已弄懂,未解决]为何这段程序不能被 kill -SIGINT 结束?
帖子发表于 : 2017-07-07 1:19 

注册: 2013-05-26 6:58
帖子: 2118
系统: Debian 9
送出感谢: 874
接收感谢: 29
为何这段程序不能被 kill -SIGINT 结束?
代码:
#include<stdio.h>
#include<signal.h>
#include<assert.h>

int main(int argc,char *argv[])
{
   for(;;)system("date;sleep 1");
}


好像调用system时就会出现无法结束
但我直接把SIGINT发送给这个程序而非子进程也不行吗?为什么?
Mon Jul 10 12:35:49 CST 2017补充:
经过2楼的引导,我搜索了glibc的system实现:
https://code.woboq.org/userspace/glibc/ ... c.html#129
尽管没看懂,但感觉意思上system确实会在某些时候忽略信号,然后在某些时候恢复信号.


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


最后由 科学之子 编辑于 2017-07-10 12:46,总共编辑了 3 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 为何这段程序不能被 kill -SIGINT 结束?
帖子发表于 : 2017-07-09 20:55 

注册: 2015-04-04 23:20
帖子: 102
系统: linux & windows
送出感谢: 4
接收感谢: 6
最近正好在看linux信号,运行了一下.
代码:
$ ./a.out
$ pstree -p -g 462
bash(462)───a.out(1995)───sh(2001)───sleep(2003)
$ cat /proc/1995/status | grep Sig
SigQ:   0/15000
SigPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000086
SigCgt: 0000000000000000
$ cat /proc/2001/status | grep Sig
SigQ:   0/15000
SigPnd: 0000000000000000
SigBlk: 0000000000010000
SigIgn: 0000000000000084
SigCgt: 0000000000010002
$ cat /proc/2003/status | grep Sig
SigQ:   0/15000
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000000000000

输出的解释请参考:
https://unix.stackexchange.com/question ... stening-to
好像是a.out进程忽略了int信号.



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
3 楼 
 文章标题 : Re: [已弄懂,未解决]为何这段程序不能被 kill -SIGINT 结束?
帖子发表于 : 2017-07-27 15:09 
头像

注册: 2008-09-18 13:11
帖子: 2741
送出感谢: 1
接收感谢: 446
都不去看manpage的吗?
代码:
SYSTEM(3)                  Linux Programmer's Manual                 SYSTEM(3)

NAME
       system - execute a shell command

SYNOPSIS
       #include <stdlib.h>

       int system(const char *command);

DESCRIPTION
       The  system()  library  function uses fork(2) to create a child process
       that executes the shell command specified in command using execl(3)  as
       follows:

           execl("/bin/sh", "sh", "-c", command, (char *) 0);

       system() returns after the command has been completed.

       During  execution  of  the command, SIGCHLD will be blocked, and SIGINT
       and SIGQUIT will be ignored, in the process that calls system()  (these
       signals  will  be  handled according to their defaults inside the child
       process that executes command).

       If command is NULL, then system() returns a status indicating whether a
       shell is available on the system



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译