Linux中的system函数详细分析
来源:互联网 发布:淘宝低价卖东西违规吗 编辑:程序博客网 时间:2024/06/13 07:48
Linux中的system函数详细分析
[size=2]system()函数功能强大,很多人用却对它的原理知之甚少,也就有了上面那么多的回帖,我想大家如果知道了system的具体实现就不会对楼主程序在很多编译器中不能表现自己希望的功能感到费解了。我对linux中的实现比较了解,具体分析这个,windows中的类似就不详解了。
好了,先看linux版system函数的源码:[code]#include
#include
#include
#include
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;
}[/code]先分析一下原理,然后再看上面的代码大家估计就能看懂了:
当system接受的命令为NULL时直接返回,否则fork出一个子进程,因为fork在两个进程:父进程和子进程中都返回,这里要检查返回的pid,fork在子进程中返回0,在父进程中返回子进程的pid,父进程使用waitpid等待子进程结束,子进程则是调用execl来启动一个程序代替自己,execl("/bin/sh", "sh", "-c", cmdstring,(char*)0)是调用shell,这个shell的路径是/bin/sh,后面的字符串都是参数,然后子进程就变成了一个shell进程,这个shell的参数是cmdstring,就是system接受的参数。在windows中的shell是command,想必大家很熟悉shell接受命令之后做的事了。
如果上面的你没有看懂,那我再解释下fork的原理:当一个进程A调用fork时,系统内核创建一个新的进程B,并将A的内存映像复制到B的进程空间中,因为A和B是一样的,那么他们怎么知道自己是父进程还是子进程呢,看fork的返回值就知道,上面也说了fork在子进程中返回0,在父进程中返回子进程的pid。
转载自:http://mcuos.com/archiver/tid-411.html
- Linux中的system函数详细分析
- Linux中的system函数详细分析
- Linux中的system函数详细分析
- Linux中的system函数详细分析
- Linux 中的 system函数
- linux getopt函数详细分析
- Linux中的system()函数工作原理
- LINUX之 Copy_from_user函数详细分析
- Linux中的fork()函数分析
- system函数分析
- system函数的分析
- System 中的数学函数
- VC中的system函数
- VC中的system函数
- System 中的数学函数
- Windows中的system函数
- Linux中的system函数的实现和解释
- 探究Linux系统中的system函数返回值
- vaturalization & multi-core trend
- 实现某些功能的命令整理
- VC++ 6.0如何创建与调用动态链接库
- SAFS与STAF框架初探
- linux 下 mysql 修改密码 修改 字符集 乱码 数据库 导入 导出 添加远程访问
- Linux中的system函数详细分析
- java中数据库重连
- My97 DatePicker
- Socket()与WSASocket()的区别
- 代码分析工具 findbugs
- Qt QApplication 类简介
- C#进度条的使用及开发浅析
- Application.HookMainWindow(AppHook)(zt)
- Qt的LGPL协议是否意味着可以自由用QT开发商业软件?