Unix学习(八)

来源:互联网 发布:在韩国能用淘宝吗 编辑:程序博客网 时间:2024/06/09 18:53

exec系列函数:在本进程中加载另一个程序并且从头执行。一旦加载成功,原来进程中的代码就不再起任何作用,所以实际加载时不保留原来代码,而是用新程序代码覆盖进程内存代码,数据也同样覆盖。因此,exec函数调用之后的代码只在exec调用失败情况下才可能得到执行。
execv(path,argv);
execvp跟execv一样,只是会通过环境变量PATH去找可执行文件
execl(path, argv中的元素数组依次排列作为参数)最后一个参数一定为NULL。execl(“/bin/ls”, “/bin/ls”, “-l”, “-d”, “/bin”, NULL);
execlp跟execl一样,只是会通过环境变量PATH去找可执行文件
execve和execle用法对应跟execv和execl一样,只是在最后增加一个参数char* env[]来传递环境变量数组
exec系列函数加载新程序之后,进程id不变,但进程内容变成新程序的了。
一般在exec函数调用之前先fork,之后在子进程中调用exec加载新程序两个程序就同时运行了。
vfork新建一个进程,类似于fork,但是它并不会去克隆,需要立即用exec系列函数加载新程序进来执行。返回跟fork一样(在子进程里返回0,在父进程里返回子进程id)。警告:在vfork调用与exec调用之间如果修改了变量的值后果不确定(保存vfork的返回结果是可以的), 最好不要在它们之间插入任何代码。

信号signal
信号是一种软中断,在程序中每个信号用一个整数表示。为了便于记忆,每个信号整数对应一个宏定义。
man 7 signal 查看信号定义的宏
SIGKILL 9必杀信号
SIGSTOP 停止信号,进程立即停止(不是终止)
SIGCONT 继续信号,系统让停止的进程继续执行
SIGINT Ctrl+C发出的信号默认是终止进程
SIGQUIT Ctrl+/发出的信号,终止进程同时产生内存映射文件core文件
SIGTSTP Ctrl+Z发出的信号,默认停止进程
SIGTERM kill命令默认发送信号,默认终止进程
SIGCHLD 子进程结束(或者停止)信号,默认忽略
SIGALRM 闹钟信号,alarm定时时间到了时系统发出的信号,默认终止

自己处理信号
signal(信号,处理函数func)登记如果指定信号到来不采用默认处理而是由函数func来处理。void func(int sig);有可能好几个信号登记了同一个处理函数,所以需要传递过来当前回调的信号。signal函数的返回值是这个信号原来的处理函数。
void (* signal( int , void (*)(int) ) ) (int)

typedef void (*func)(int); //为函数指针起个别名func
func signal(int, func);
kill -信号 pid:发送指定信号到指定进程
信号可能会打断正在阻塞中的函数,使函数失败返回。errno设置为被信号打断EINTR。
alarm(秒数)定时指定秒数之后系统向进程发送SIGALRM信号。
积压的多个相同的信号可能会合并为一个。
setitimer(定时器类型,定时器结构变量,旧的定时结构),设置反复发生的定时器
raise(信号)给本进程发送信号,相当于直接调用信号回调函数,比较少用
kill(pid,sig)向指定进程pid发送一个sig信号。如果pid为0,表示向本组的所有进程发送信号(子进程默认跟父进程同组)。如果sig为0,其实不发送信号,用来检测pid进程是否存在。kill成功返回0,失败返回-1。
signal(信号, SIG_IGN)忽略指定信号
signal(信号,SIG_DEF)恢复信号的默认处理
signal 返回SIG_ERR(也就是-1)表示出错
关机是系统向所有进程发送SIGTERM信号,如果没有结束,系统习惯会发送SIGKILL信号。因此一般程序都应该捕获SIG_TERM信号,让自己正常结束。
用信号可以在进程间通信。

0 0
原创粉丝点击