求大神帮我看下这段代码什么问题,C语言信号控制方面的

求大神帮我看下这段代码什么问题,C语言信号控制方面的,第1张

给你指出这个程序存在的问题:

在Linux中, SIGKILL 信号不能被阻塞,处理和忽略,这意味着你程序中的 "signal(SIGKILL, fun1)和signal(SIGKILL, fun2)" 永远捕捉不到你的 "kill(pid1, SIGKILL)和kill(pid2, SIGKILL)"。还有两个信号和SIGKILL一样特别,自己去查查。

然后就是你的程序其实已经kill掉进程1、2了,正如1中所述,用户不能处理SIGKILL,自然就不会调用 fun1() 和 fun2(),所以你在运行程序之后按下 “Ctrl+C”组合键能够看到“Parent process exit!”却看不到“Child process 1 is killed by parent! 和 Child process 2 is killed by parent! ”。

进程1、2被kill掉,waitpid()函数完成使命,父进程执行到 while (1) { } 循环里面,程序陷入死循环,你的程序执行流程就是这样。

你想让子进程在一直死循环,直到被父进程调用kill()函数kill掉,思路没有问题,但你却把这个死循环写在了程序的最后,这样做子进程1、2和父进程都会有一个死循环,导致程序最终不能退出。所以你可以分别在子进程1、2中写一个 while ( 1 ) { } ,而父进程不用,因为waitpid一结束父进程也就结束了。

把问题说完了(不知道有没有说清楚),那么剩下的事情就是修改程序了,自己去琢磨琢磨吧!!!

Linux kill 命令用于终止进程,其用法步骤如下:

需要准备的材料分别是:电脑、linux连接工具。

1、首先连接上linux主机,进入命令行状态。

2、输入:ps -ef,按回车,查询进程列表。

3、选择需要终止的进程,例如PID为9977的进程,则命令行输入:kill 9977,按回车即可终止该进程。

题目 :
在 *** 作系统中,一个进程可以创建另一个进程。创建者称为父进程,被创建者成为子进程。当父进程被终止后,子进程可能有两种状态:

请在linux实验验证:什么情况下出现第一种结果,什么情况下出现第二种结果。

查询正在运行的进程信息

查询系统的进程树,进而查看某个进程的父进程

同时查询进程的id,和其父进程id

杀死指定id的进程

一般来讲, 我们编写1个普通的c程序, 运行这个程序直到程序结束, 系统只会分配1个pid给这个程序, 也就就说, 系统里只会有一条关于这个程序的进程。 但是当执行Fork()函数之后,系统则会包含多条关于这个程序的进程。Fork()函数的作用是复制当前进程(包括进程在内存里的堆栈数据)为1个新的镜像 然后这个新的镜像和旧的进程同时执行下去 相当于本来1个进程, 遇到fork() 函数后就分叉成两个进程同时执行了 而且这两个进程是互不影响

查看进程:

kill了父进程(电脑同时黑屏了):

创建父进程和子进程

运行后系统的进程:

杀掉父进程:

若希望改进使得父进程结束后,子进程自动结束:

父进程未结束,子进程先结束,会产生僵尸进程。
子进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。
即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程的避免:
(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父
进程会收到该信号,可以在handler中调用wait回收。
(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN) 通知内
核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送
信号。
(4) 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进
程后退出,那么孙进程被init接管,孙进程结束后, init会回收。不过子进程的回收 还要自己
做。
建议你使用第三种方法,父进程直接忽略子进程的结束,留给内核作回收处理。这样就不
会产生僵尸进程。

1 在LINUX命令平台输入1-2个字符后按Tab键会自动补全后面的部分(前提是要有这个东西,例如在装了tomcat的前提下,输入tomcat的to按tab)。
2 ps 命令用于查看当前正在运行的进程。
grep 是搜索
例如: ps -ef | grep java
表示查看所有进程里CMD是java的进程信息
ps -aux | grep java
-aux 显示所有状态
ps
3 kill 命令用于终止进程
例如: kill -9 [PID]
-9表示强迫进程立即停止
通常用ps 查看进程PID ,用kill命令终止进程
网上关于这两块的内容
-----------------------------------------------------------------------------------
PS
-----------------------------------------------------------------------------------
1 ps简介
ps命令就是最根本相应情况下也是相当强大地进程查看命令运用该命令可以确定有哪些进程正在运行和运行地状态、进程是否结束、进程有没有僵死、哪些进程占用了过多地资源等等总之大部分信息均为可以通过执行该命令得到地
2 ps命令及其参数
ps命令最经常使用地还是用于监控后台进程地工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设
备进行通信地,所以如果需要检测其情况,便可以运用ps命令了
该命令语法格式如下:
ps [选项]
-e 显示所有进程,环境变量
-f 全格式
-h 不显示标题
-l 长格式
-w 宽输出
a 显示终端上地所有进程,包括其他用户地进程
r 只显示正在运行地进程
x 显示没有控制终端地进程
O[+|-] k1 [,[+|-] k2 [,…]] 根据SHORT KEYS、k1、k2中快捷键指定地多级排序顺序显示进程列表
对于ps地不同格式都存在着默认地顺序指定这些默认顺序可以被用户地指定所覆盖在这里面“+”字符是可选地,“-”字符是倒转指定键地方向
pids只列出进程标识符,之间运用逗号分隔该进程列表必须在命令行参数地最后一个选项后面紧接着给出,中间不能插入空格比如:ps -f1,4,5
以下介绍长命令行选项,这些选项都运用“--”开头:
--sort X[+|-] key [,[+|-] key [,…]] 从SORT KEYS段中选一个多字母键“+”字符是可选地,因为默认地方向就是按数字升序或者词典顺序比如: ps -jax -sort=uid,-ppid,+pid
--help 显示帮助信息
--version 显示该命令地版本信息
在前面地选项说明中提到了排序键,接下来对排序键作进一步说明需要注意地是排序中运用地值是ps运用地内部值,并非仅用于某些输出格式地伪值排序键列表见表4-3
表4-3 排序键列表
c
cmd
可执行地简单名称
C
cmdline
完整命令行
f
flags
长模式标志
g
pgrp
进程地组ID
G
tpgid
控制tty进程组ID
j
cutime
累计用户时间
J
cstime
累计系统时间
k
utime
用户时间
K
stime
系统时间
m
min_flt
次要页错误地数量
M
maj_flt
重点页错误地数量
n
cmin_flt
累计次要页错误
N
cmaj_flt
累计重点页错误
o
session
对话ID
p
pid
进程ID
P
ppid
父进程ID
r
rss
驻留大小
R
resident
驻留页
s
size
内存大小(千字节)
S
share
共享页地数量
t
tty
tty次要设备号
T
start_time
进程启动地时间
U
uid
UID
u
user
用户名
v
vsize
总地虚拟内存数量(字节)
y
priority
内核调度优先级

3 经常使用ps命令参数
最经常使用地三个参数是u、a、x,下面将通过例子来说明其具体用法
[例20] 以root身份登录系统,查看当前进程状况
$ ps
PID TTY TIME COMMAND
5800 ttyp0 00:00:00 bash
5835 ttyp0 00:00:00 ps
可以看到,显示地项目共分为四项,依次为PID(进程ID)、TTY(终端名称)、TIME(进程执行时间)
、COMMAND(该进程地命令行输入)
可以运用u选项来查看进程所有者及其他少许详细信息,如下所示:
$ ps u
USER PID %CPU %MEM USZ RSS TTY STAT START TIME COMMAND
test 5800 00 04 1892 1040 ttyp0 S Nov27 0:00 -bash
test 5836 00 03 2528 856 ttyp0 R Nov27 0:00 ps u
在bash进程前面有条横线,意味着该进程便是用户地登录shell,所以对于一个登录用户来说带短横线地进程只有一个还可以看到%CPU、%MEM两个选项,前者指该进程占用地CPU时间和总时间地百分比;后者指该进程占用地内存和总内存地百分比
在这种情况下看到了所有控制终端地进程;当然对于其他那些没有控制终端地进程还是没有观察到,所以这时就需要运用x选项运用x选项可以观察到所有地进程情况

使用ps aux|grep ”脚本名“这种方式查找时,查看grep ”脚本“以外行的PID。 ps -ef 能比较直观显示进程PID、PPID(当前PID的父进程),程序名(最后一列)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13380992.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-25
下一篇 2023-07-25

发表评论

登录后才能评论

评论列表(0条)

保存