Linux中的system()函数工作原理
来源:互联网 发布:教打字的软件 编辑:程序博客网 时间:2024/06/10 20:38
一、Linux中的system()函数源代码
#include <sys/types.h>#include <sys/wait.h>#include <errno.h>#include <unistd.h>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接受的命令为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函数的使用
在Unix/Linux中用fork函数创建一个新的进程。进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程。该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程。两次返回的区别是子进程的返回值为0,父进程的返回值是新子进程的ID。子进程与父进程继续并发运行。如果父进程继续创建更多的子进程,子进程之间是兄弟关系,同样子进程也可以创建自己的子进程,这样可以建立起定义关系的进程之间的一种层次关系。
程序包含位于内存的多个组成部分,执行程序的过程将根据需要来访问这些内容,包括文本段(text segment)、数据段(data segments)、栈(stack)和堆(heap)。文本段中存放CPU所执行的命令,数据段存放进程操作的所有数据变量,栈存放自动变量和函数数据,堆存放动态内存分配情况数据。当进程被创建时,子进程收到父进程的数据副本,包括数据空间、堆、栈和进程描述符
阅读全文
0 0
- Linux中的system()函数工作原理
- Linux 中的 system函数
- 浅谈Java中的System.gc()的工作原理
- 浅谈Java中的System.gc()的工作原理
- 浅谈Java中的System.gc()的工作原理
- 浅谈Java中的System.gc()的工作原理
- 浅谈Java中的System.gc()的工作原理
- 浅谈Java中的System.gc()的工作原理
- Linux中的system函数详细分析
- Linux中的system函数详细分析
- Linux中的system函数详细分析
- Linux中的system函数详细分析
- C语言(scanf函数工作原理)
- 虚函数工作原理
- 递归函数工作原理
- 虚函数工作原理
- 函数的工作原理
- recv()函数工作原理
- 安卓API指南之Fragment回顾
- Mac OS 10.13.1 brew install opencv log
- 2017秋招总结
- 静态导入
- Hive 优化之 共享中间结果集
- Linux中的system()函数工作原理
- Spark2.2 任务调度机制schedule()源码剖析
- Android 判断有效的Sim card数
- error while loading shared libaries( libc.so.6误删)(开机启动不了)
- 前端之js框架-vue
- TensorFlow学习笔记(八)
- 当面试官问你“我为什么要聘用你”
- Hadoop Shell命令
- Ajax的使用四大步骤