0
点赞
收藏
分享

微信扫一扫

<找工作>进程与信号

和谐幸福的人生 2022-02-15 阅读 108
linux

一、进程

进程:一个其中运行着一个或多个线程的地址空间以及线程所需的系统资源。

ps命令:process status查看正在运行的进程的状态

PID:2-32768 1一般为特殊进程Init保留,init进程负责管理其他进程。

1、创建子进程

替换进程印象:

exec系列函数:将程序的执行从一个程序切换到另一个程序,新的程序启动后,原来的程序不再执行。

复制进程印象:

fork函数:创建新进程。新进程与原来进程执行的代码相同,但它有自己的数据空间、环境与文件描述符。

创建子进程失败可能原因:

(1)当父进程所拥有的子进程数目超过了规定的限制(CHILD_MAX),可能会导致创建子进程失败。errno:EAGAIN

(2)进程表里没有足够的空间用于创建新的表单或虚拟内存不足。errno:ENOMEM

2、等待进程

(1)pid_t wait(int *stat_loc)调用返回子进程的PID,如果stat_loc不是空指针,子进程的状态信息将被写入它指向的位置。

状态信息:

WIFEXITED(stat_val)          如果子进程正常结束,返回非0值

WEXITSTATUS(stat_val)        如果WIFEXITED非0,返回子进程的退出码

WIFSIGNALED(stat_val)        如果子进程因为一个未捕获的信号而终止,返回非0值

WTERMSIG(stat_val)         如果WIFSIGNALED返回非0值,返回一个信号代码

WIFSTOPED(stat_val)         如果子进程意外终止,它返回非0值

WSTOPSIG(stat_val)        如果WIFSTOPED非0,它返回一个信号代码

(2)pid_t waitpid(pid_t pid, int *stat_loc, int option)等待指定的进程

3、僵尸进程

子进程终止后,它跟父进程之间的联系还会保持,直到父进程也正常终止或负进程调用wait才终止。因此,进程表中代表子进程的表项不会立刻释放,它的退出码还需要保存起来供父进程今后的wait使用。这时它将成为一个僵尸进程或死进程。

如果父进程异常终止,PID为1的init进程将作为父进程。

二、输入输出重定向

ex: 

cat file.txt //  aaaaaa

./upper  < file.txt //AAAAAA

三、信号

信号是系统响应某些条件而产生的一个事件,信号由某些错误条件而生成的。如果正在执行的进程接收到信号但是没有事先安排捕获它,进程将终止。

常见信号:

SIGABORT        进程异常终止

SIGINT        终端中断(ctrl+c)

SIGKILL        终止进程(此信号不能被捕获或忽略)

SIGSEGV        无效内存段访问

SIGSTOP        停止执行

SIGCHLD        子进程已经停止或退出,默认情况下,它是被忽略的

SIGCONT        继续执行暂停进程

如果想发送一个信号给进程,但是该进程不是当前的前台进程,需要使用Kill命令发送信号

1、发送信号

int kill(pid_t pid, int sig);

pase();//将程序执行挂起,直到有一个信号出现为止。

2、信号处理函数

(1)void (*signal(int sig, void (*func)(int)))

sig:处理的信号  func:接收到信号后调用的函数

signal函数返回的是信号处理函数的函数指针。

信号处理函数也可用SIG_IGV(忽略信号)、SIG_DFL(恢复默认行为)

#include <signal.h>
#include <stdio.h>
#include <unistd.h>
void A(int sig)
{
    printf("I got signal %d\n",sig);
    (void) signal(SIGINT, SIGDFL);//恢复默认行为
}

int main()
{
    (void) signal(SIGINT, A);
    while(1)
    {
        printf("hh\n");
        sleep(1);
    }
}

注意,在信号处理函数中调用printf函数是不安全的。printf的内部实现需要先获得输出端的锁,然后修改输出端,最后释放输出端的锁。如果主程序刚好获得输出端的锁,而信号使主程序中断,但信号处理函数在等待主程序释放锁,从而造成了死锁。

(2)健壮的信号接口

int sigaction(int sig,  const struct sigaction *act, struct sigaction *oact);

sigaction结构包含:

void (*) (int) sa_hander  //function, SIG_IGN or SIG_DFL

sigset_t sa_mask  //信号集,在调用信号处理函数前,该信号集将被进程屏蔽

int sa_flags  //信号处理函数默认不被重置,如果需要重置,可将其设置为SA_RESETHAND

举报

相关推荐

0 条评论