system execl
2015-07-01 17:14
225 查看
1. system();
int system(const char *command);
在Windows下,用来调用常用的Dos命令
在Linux下,system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略
system()在调用/bin/sh时失败则返回127,其他失败原因返回-1
如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功
2 返回值
system函数返回结果并非command命令的结果返回,而是返回shell的终止状态,而非执行命令字符串的终止状态
exit退出时,父进程中只取其低8位。高于255的值是没有意义
3. SIGCHLD信号
执行system函数,还会受到SIGCHLD信号处理的影响,他需要的方式就是SIG_DFL,不可以使用其他信号处理。如果当前进程有semop在睡眠,会收到EINTR信号而中断
4. execl();
int execl(const char *path, const char *arg, …);
execl()其中后缀”l”代表list也就是参数列表的意思,第一参数path字符指针所,指向要执行的文件路径, 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]… 最后一个参数须用空指针NULL作结束。
// 执行/bin目录下的ls, 第一参数为程序名ls, 第二个参数为”-al”, 第三个参数为”/etc/”
execl(“/bin/ls”,”ls”,”-al”,”/etc/”,NULL);
execl与system的一个区别:
使用execl时最好在之前先调用fork,在子进程中执行execl,否则execl会返回。而system则不用,因为从它的实现源码来看,实际上已经调用了fork
int system(const char *command);
在Windows下,用来调用常用的Dos命令
在Linux下,system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略
//源码 int system(const char * cmdstring) { pid_t pid; int status; if(cmdstring == NULL) { return (1); } if((pid = fork()) < 0) { status = -1; } else if(pid == 0) { execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); -exit(127); //子进程正常执行则不会执行此语句 } else { while(waitpid(pid, &status, 0) < 0) { if(errno != EINTER) { status = -1; break; } } } return status; }
system()在调用/bin/sh时失败则返回127,其他失败原因返回-1
如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功
if(WIFEXITED(status)) { printf("normal termination, exit status=%d\n", WEXITSTATUS(status)); //取得cmdstring执行结果 } else if(WIFSIGNALED(status)) { printf("abnormal termination,signal number=%d\n", WTERMSIG(status)); //如果cmdstring被信号中断,取得信号值 } else if(WIFSTOPPED(status)) { printf("process stopped, signal number=%d\n", WSTOPSIG(status)); //如果cmdstring被信号暂停执行,取得信号值 }
2 返回值
system函数返回结果并非command命令的结果返回,而是返回shell的终止状态,而非执行命令字符串的终止状态
//命令错误 ret = system("lad /home"); ret = 32512 //命令正确,执行错误 ret = system("ls /ttt"); ret = 512 > 255 //高8位有值 //命令正确,执行正确 ret = system("ls /home"); ret = 0
exit退出时,父进程中只取其低8位。高于255的值是没有意义
3. SIGCHLD信号
执行system函数,还会受到SIGCHLD信号处理的影响,他需要的方式就是SIG_DFL,不可以使用其他信号处理。如果当前进程有semop在睡眠,会收到EINTR信号而中断
sighandler_t old_handler; old_handler = signal(SIGCHLD, SIG_DFL); ret = system(cmd_line); signal(SIGCHLD, old_handler);
4. execl();
int execl(const char *path, const char *arg, …);
execl()其中后缀”l”代表list也就是参数列表的意思,第一参数path字符指针所,指向要执行的文件路径, 接下来的参数代表执行该文件时传递的参数列表:argv[0],argv[1]… 最后一个参数须用空指针NULL作结束。
// 执行/bin目录下的ls, 第一参数为程序名ls, 第二个参数为”-al”, 第三个参数为”/etc/”
execl(“/bin/ls”,”ls”,”-al”,”/etc/”,NULL);
execl与system的一个区别:
使用execl时最好在之前先调用fork,在子进程中执行execl,否则execl会返回。而system则不用,因为从它的实现源码来看,实际上已经调用了fork
相关文章推荐
- 主键与聚集索引的区别
- Android 新控件RecyclerView
- 判断目前系统中的等待事件
- MySql的基本操作流程-SAE的MySQL-PHP
- 决策树算法
- 关于angularjs在IE里的坑——F12工具打开,功能正常,关闭之后,angularjs not working
- linux大杂烩
- Protocol 编码的三种常用方式
- XCode开发证书生成步骤
- mfc listcontrol控件改变字体大小
- NGINX引入线程池 性能提升9倍
- Java基础:容器
- OpenCV实现视频播放和进度条
- 函数模板
- Android监听程序的安装和卸载
- 环境变量
- iOS 时间
- const使用摘要
- tcpdump使用范例
- Android 在一个Activity的一部分中显示其他Activity