Linux里的fork,popen,system函数
今天介绍一下Linux里fork,popen,system三个函数:
1.fork函数
fork函数是通过复制父进程来创建子进程,父子进程代码共享数据独有,这是一种分时拷贝技术,相对于vfork函数来说有较大的改进之处,返回值是来分流父子进程,对于父进程返回的是子进程的pid>0,对于子进程,返回的是0。
从图中可以看到它是一个系统调用函数
2.system函数
system函数可以看作是fork+execl+waitpid。当system接收的命令为NULL时返回值只有0和1两种,返回1表明系统的命令处理程序即/bin/sh是可用的,相反则返回0;否则fork出一个子进程,父进程则会使用waitpid一直等待子进程退出,子进程则会调用execl来启动一个程序代替自己,execl("/bin/sh",“sh”,"-c",cmdstring,(char*)0)是调用shell,这个shell路径是/bin/sh,后面的字符串都是参数,然后子进程就变成一个shell进程,这个shell的参数是cmdstring,就是system接受的参数。
从图中可以看到这是一个库函数
3.popen函数
popen函数用创建管道的方式启动一个进程,并调用shell,因为管道被定义成单向的,所以type参数只能定义成只读或只写,不能两者同时进行,结果流也相应的是只读或只写,command参数是一个字符串指针,指向一个以null结束符结尾的字符串,这个字符串也包含一个shell命令,这个命令被送到/bin/sh以-c参数执行,即由shell来执行,type参数也是一个指向以null结束符结尾的字符串的指针,这个字符串必须是’r’或者’w’来指明是读还是写。
popen函数的返回值是一个普通的标准I/O流,它只能用pclose函数来关闭。
**返回值:**若成功则返回文件指针,否则返回NULL,错误原因存于errno中。
从图中可以看到它也是一个库函数