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