您的位置:首页 > 运维架构 > Linux

linux下用代码实现系统命令

2015-04-13 16:55 459 查看
<span style="color:#3333ff;">第一例:实现系统命令</span>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
void my_system(char *str)
{
pid_t pid;
pid=fork();
if(pid<0)
{
perror("fork");
}
if(pid==0)
{
execlp("/bin/sh","sh","-c",str,NULL);
}
if(pid>0)
{
int status=0;
wait(&status);
if(WIFEXITED(status))
{
printf("return value=%d\n",WEXITSTATUS(status));
}
}
}
int main(int argc, char *argv[])
{
char str[50]="";
printf("please input :");
fgets(str,10,stdin);
my_system(str);
return 0;
}
<span style="color:#3333ff;">第二例:实现系统命令并将其打印出的数据放入数组</span>
#include <stdio.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
pid_t pid;
int ret = 0;
int fd[2] = {0};

//创建管道
ret = pipe(fd);
if(ret == -1)
{
perror("pipe");
_exit(1);
}

//创建子进程,目的  1exec 2复制管道文件描述符
pid = vfork();
if(pid < 0)
{
perror("vfork");
}
else if(pid == 0)
{
dup2(fd[1], 1);//标准输出重定向到管道的写端
//该命令打印的是  主板序列号,是我项目需要,大家可以将str改为自己想要实现的命令,如 ls
char str[50]="dmidecode -s system-serial-number";
execlp("/bin/sh","sh","-c",str,NULL);
}
else
{
char result[100] = "";
read(fd[0], result, sizeof(result));//从管道的读端读取数据
char msg[100] = "";
sprintf(msg, "%c%c:%c%c:%c%c",result[7],result[8],result[10],result[11],result[13],result[14]);
printf("---->%s\n",msg);
}
return 0;
}

<span style="color:#3333ff;">后续发现:
上面第一例的代码 实际上是用代码封装了system()函数,本人测试过,将命令当做参数写入system();也可以实现相应的效果,下面是从网上摘抄的system()源码:
</span>

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: