提到进程,首先想到的自然是ps.这个命令可以查看进程的状态.也会想到/proc目录.当前系统的所有进程都以文件的形式保存在这里.
首先了解一下ps命令.比较常用的一些组合.我是记不住.现用现查.
比如ps axu输出部分如下:
这里着重说一下第八个字段,进程状态:
S sleep(睡眠)
R run(运行)
s session(会话组首进程)
N 优先级比较低(不知道是哪个单词)
< 高优先级进程
+ 前台进程
l 多线程进程
D 不可中断的睡眠.(没见过)
T 停止,GDB调试会导致进程进入这个状态.
Z zombie进程,死了但是还没有死利索.
W 分页(没有见过)
下面简单的通过一个小例子来看看这几个状态.
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <signal.h>
#include <stdlib.h>
static int selfkill = 0;
void thread1()
{
while (1)
{
sleep(5);
return;
}
}
void ding(int signo)
{
printf("ouch, I am late\n");
sleep(5);
selfkill = 1;
printf("selfkill %d\n", selfkill);
}
void child_handle()
{
sleep(5);
wait(NULL);
}
int main(int argc, char ** argv)
{
nice(-20);
pthread_t tid;
pthread_create(&tid, NULL, (void*)&thread1, NULL);
signal(SIGINT, child_handle);
pid_t pid = fork();
switch (pid)
{
case -1:
perror("fork error\n");
break;
case 0:
{
signal(SIGALRM, ding);
alarm(5);
while (1)
{
printf("I am child, selfkill %d\n", selfkill);
sleep(5);
if (selfkill != 0)
{
exit(-1);
}
}
}
break;
default:
nice(40);
break;
}
while (1)
{
system("ps axu | grep a.out");
sleep(5);
}
return 0;
}
这个小的示例首先建立一个线程,然后注册信号处理函数.捕捉ctrl+C.
建立子进程,在子进程中注册ALARM信号处理函数.实现子进程自残.打印结果如下:
没有什么新颖的内容.也没有什么独特的见解.仅仅是对所学的一个总结.当然可能总结的并不是很全面.