linux execl?linux打开软件命令
linux中为什么在fork里面execl呢
因为exec系列的函数(包括execl函数)都是将当前进程替换成新进程,也就是说新进程启动后原来的进程就不存在了,exec系列函数后面的那些代码就不会再执行了。如果你不放在fork子进程里面,那主进程在执行execl函数后就完全不存在了,所以exec系列函数的使用都是先fork然后在子进程里面调用。
【C/C++ execl异常】No such file or directory
平台支持自定义组件功能,允许用户上传可执行文件(bin/python/shell等等)。有用户反馈上传的python脚本组件输出不符合预期,遂进行定位。
定位问题异常点是 fork后调用 execl失败,系统报错 errno(2),错误信息为 No such file or directory,但实际情况是拉起的文件无法执行。
1、通过 su-命令切换至程序所属用户:用户侧权限可以查看到文件,使用 python文件名可正确执行
2、 gdb跟踪程序:断点到程序执行到对应位置通过 access函数定位程序具备文件的读/执行权限,但继续向后走调用 execl会失败并返回 errno(2),错误信息为 No such file or directory。
1、由上述分析可以看出,文件确实存在,但是因为其他原因导致执行时报错文件不存在。
2、异常原因:用户侧windows下编辑文件,使文件带有windows换行符。Linux解析时发现最后带有特殊字符,致使文件第一行解析器解析失败,完整报错信息(/usr/bin/python^M: bad interpreter: No such file or directory)
通过 dos2unix函数,可以将文件装换为Linux下的问题,转换后就可以正常执行了。
Linux下的报错信息也不绝对,还是要根据时间情况进行分析
Windows下可以通过 file命令来进行识别, dos2unix来进行转换
C语言中 使用execl函数创建一个文件
创建方法如下:
execl("/bin/touch","touch","./XX");在当前目录下创建XX文件;
execl函数的用法如下:
fork, execle, execlp, execv, execve, execvp
Windows下头文件如下:
#include<process.h>
Linux下头文件如下:
#include<unistd.h>
函数定义如下:
int execl(const char*path, const char*arg,...);
函数说明如下:
execl()其中后缀"l"代表list也就是参数列表的意思,第一参数path字符指针所指向要执行的文件路径,接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]...最后一个参数须用空指针NULL作结束。