linux下用代码实现系统命令

来源:互联网 发布:赢顺交易软件 编辑:程序博客网 时间:2024/06/04 09:58
<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改为自己想要实现的命令,如 lschar 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 0