cha27.进程执行
exec()
- 带e的可以指定环境变量,否则继承
- 带p的允许只提供文件名,允许提供不带
"/"
的路径,在path中寻找- 若无
env PATH
默认为.:/usr/bin/:/bin
- 从左往右搜索,直到找到为止
- 若无
- 带l的用不定长参数(参数列表),以NULL结尾
- execle在NULL后面接envp数组
exec执行脚本
当exec第一个参数文件以"#!"
开始,则会读取该行进行解析
1 | #!<interpreter-path> [arg] <script> <script-args...> |
如
1 |
若
1 | execl("xxx.sh", "argv1", "argv2", ..., NULL); |
则实际调用为
1 | execl("/bin/bash", "--debug", "xxx.sh", "argv1", "argv2", ..., NULL); |
1 |
信号与exec
exec时,会将设置了信号处理器函数的信号置为SIG_DFL,将SA_ONSTACK位清除
但是对于置为SIG_IGN的SIGCHLD是否会置为SIG_DFL,susv3并未规定
信号掩码(就是SA_INFO, SA_NODEFER那些东西)与挂起信号的设置会被保存
27.1
1 | export PATH=/usr/local/bin:/usr/bin:/bin/:./dir1:./dir2 |
执行失败?搜索到dir1下,但是没有执行权限?
结果
执行成功,访问到dir2下的xyz
27.2
用execve实现execlp
1 |
|
27.3
27-3.如果赋予如下脚本可执行权限并以exec()运行,输出结果如何?
1 | !/bin/cat -n |
打印文件内容并显示行号
27.4
下列代码会有什么效果?在何种情况下会起作用?
1 | childPid = fork(); |
创建一个孤儿进程,执行真正的任务
作用:比如创建服务器的守护进程
27.5
27-5.运行如下程序时无输出。试问原因何在?
1 | int main(int argc,char *argv[]){ |
还没有fflush,stdio的缓存还未写入系统的缓冲(因为printf没加'\n'
),进程就被替换了。
27.6
假设父进程为信号SIGCHLD创建了一处理器程序,同时阻塞该信号。随后,其某一子进程退出,父进程接着执行 wait)以获取该子进程的状态。当父进程解除对SIGCHLD的阻塞时,会发生什么?编写一个程序来验证答案。这一结果与调用system()函数的程序之间有什么关联?
1 |
|
收到一个非常正常的信号
和system的关联是,,system也是这么实现的??