使用vfork、exec系列函数、wait/waited实现system函数的功能
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int _system(const char* cmd)
{
const char* space = NULL;
char* argv[256] = {}; //定义一个存放命令行的指针数组,每一个小命令存一下
int argc = 0;
while(space = strchr(cmd,' ')) //sscanf不接收空格,这里先寻找命令行输入的空格
{
char* arg = malloc(space-cmd)+1;
sscanf(cmd,"%s",arg);
argv[argc++] = arg; //将ls -l -a分成3个存入argv
cmd = space+1;
}
argv[argc++] = (char*)cmd; //-a后面没有空格,存在最后
pid_t pid = vfork();
if(-1 == pid)
{
perror("vfork");
return -1;
}
if(0 == pid)
{
if(-1 == execvp(argv[0],(char* const*)argv))
{
perror("execlp");
return -1;
}
}
else
{
int status = 0;
int ret = waitpid(pid,&status,0);
printf("%d %d",ret,pid);
if(ret != pid)
{
perror("waitpid");
return -1;
}
for(int i=0; i<argc-1; i++)
{
free(argv[i]);
}
}
return 0;
}
int main()
{
_system("ls -l -a");
}