system
功能:system()函数调用"/bin/sh -c command"执行特定的命令,阻塞当前进程直到command命令执行完毕
原型
int system(const char *command);
返回值:
如果无法启动shell运行命令,system将返回127;出现不能执行system调用的其他错误时返回-。如果systenm能够顺利执行,返回那个命令的退出码
system函数执行时,内部会调用fork,execve,waitpid等函数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h> //自己实现system函数
int my_system(const char * command)
{
if(command==NULL)
{
printf("command not allow null!\n");
return -;
}
pid_t pid = ;
int status=;
pid = fork();
if (pid < )
{
status=-;
}
if(pid==)
{
//执行shell命令
execle("/bin/sh","sh","-c",command,NULL,NULL);
exit();
}else if(pid>)
{
//先执行一次waitpid,但是要处理阻塞中的信号中断
while(waitpid(pid,&status,)<)
{
if(errno==EINTR)
//如果是信号中断,应该一直执行一次waitpid,直到等待子进程返回
continue;
//发现不是信号中断,导致waitpid返回-1,直接退出,表明此时父进程已经成功接收到子进程的pid
//特别注明:执行到这里,说明waitpid已经执行失败,如果能成功接收到子进程的pid,应该不会进入while循环
status=-;
break;
}
}
return status;
} int main(int arg, char *args[])
{
char buf[]={};
read(STDIN_FILENO,buf,sizeof(buf));
my_system(buf);
return ;
}

最新文章

  1. Java中serialVersionUID的解释及两种生成方式的区别(转载)
  2. [转]DataURL与File,Blob,canvas对象之间的互相转换的Javascript
  3. php框架laravel:数据库建立:artisan
  4. poj 1094(拓扑排序)
  5. Caffe学习系列(11):图像数据转换成db(leveldb/lmdb)文件
  6. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句
  7. Ogre初入手:最简单的ogre程序骨架
  8. popen&amp;pclose管道方式操作shell命令
  9. ubuntu下使用nethogs监控网络流量
  10. 非常不错的KPTimePicker效果源码
  11. TFS(Team Foundation Server)介绍和入门
  12. Buffer Cache(缓冲区缓存)篇:缓存区块大小
  13. Slave_SQL_Runing:NO 复制出现问题的解决办法
  14. LindDotNetCore~框架介绍及特色功能(有点springboot的意思)
  15. redis与memacache的区别(转)
  16. MySQL 加锁处理分析&lt;转&gt;
  17. Java singleton 一例
  18. buildroot 编译问题
  19. win10中命令操作Zookeeper
  20. SQL优化系列——索引

热门文章

  1. GIT和SVN之间的五个基本区别
  2. 最近用Timer踩了一个坑,分享一下避免别人继续踩
  3. Spring boot 基于Spring MVC的Web应用和REST服务开发
  4. oracle和postgresql 递归查询父子关系记录语法区别
  5. 总结eclipse中安装maven插件
  6. Docker是什么
  7. my_atoi()
  8. php魔术方法罗列
  9. Android中dip、dp、sp、pt和px的区别
  10. node js学习(二)——REPL(交互式解释器)