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信号,让自己正常结束。
用信号可以在进程间通信。
- Unix学习(八)
- Unix C (八)
- 老赵弱弱学习——unix环境高级编程(八)
- Unix环境高级编程学习笔记(八) 线程同步
- UNIX环境高级编程学习笔记(八)进程环境
- UNIX(AIX)系统常用命令(八)
- db2&unix使用总结(八)
- UNIX网络编程(八)读写锁
- unix编程(八)高级I/O
- 《Unix & Linux 大学教程》 - 第七、八章 学习笔记
- 《Unix & Linux 大学教程》 - 第七、八章 学习笔记
- Unix学习(一)
- Unix学习(二)
- Unix学习(三)
- Unix学习(四)
- Unix学习(五)
- Unix学习(六)
- Unix学习(七)
- 同样的错误不能犯两次(三):打招呼
- GeekBand--第六周分享
- d=sa+tb
- 差点跑进奥运会赛场的“人类计算机之父”
- MP4文件,Web播放器不能边下边播问题
- Unix学习(八)
- Integer和int的种种比较
- float vs int
- GCDAsyncSOcket使用及其SSL/TLS双向认证的实现
- 03-如何对Memchached进行CRUD操作?
- 虐人的hd1001 Sum Problem
- pcl里面的点特征直方图(PFH)
- 如何使用xpdf把本地磁盘上的pdf转化为txt
- 反转链表