linux下用代码实现系统命令

<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;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值