system popen 输出重定向和显示输出的问题

(一)system 使用

1,输出重定向实现

此方法比较简单,步骤如下

1)system("date > tmp.txt");    --将date指令的输出重定向到tmp.txt文件中

2)使用open();read();等操作函数来获取tmp.txt的内容


2,重定向标准标准输出+管道实现

1)将标准输出重定向到管道:

int fd[2],backfd;

pipe(fd);

backfd=dup(STDOUT_FILENO);   --备份标准输出,永远恢复

dup2(fd[1],STDOUT_FILENO);    --将标准输出重定向到匿名管道输入端

2)执行system();

system("date");

3)获取结果并恢复标准输入

read(fd[0],buf,1024);

dup2(backfd,STDOUT_FILENO);


3,完整代码


  1. #include<stdio.h>  
  2. #include<unistd.h>  
  3. #include<stdlib.h>  
  4.   
  5.   
  6. int main(void)  
  7. {  
  8.     char buf[1024]={0};  
  9.     int fd[2];  
  10.     int backfd;  
  11.     pipe(fd);  
  12.     backfd=dup(STDOUT_FILENO);//备份标准输出,用于恢复  
  13.     dup2(fd[1],STDOUT_FILENO);  //将标准输出重定向到fd[1]  
  14.     system("date");  
  15.       
  16.     read(fd[0],buf,1024);  
  17.   
  18.     dup2(backfd,STDOUT_FILENO);  //恢复标准输出  
  19.     printf("this is a test :\n%s",buf);  //上面不恢复,则此处的执行结果无法再屏幕上打印  
  20.   
  21.     return 0;  
  22. }  

(二)popen 使用

#include <sys/types.h>  
#include <unistd.h>  
#include <stdlib.h>  
#include <stdio.h>  
#include <string.h>

int main( void )  
{  
    FILE   *stream;  
    FILE    *wstream;
    char   buf[1024];
    
    memset( buf, '/0', sizeof(buf) );//初始化buf,以免后面写如乱码到文件中
    stream = popen( "ls -l", "r" ); //将“ls -l”命令的输出 通过管道读取(“r”参数)到FILE* stream
    wstream = fopen( "test_popen.txt", "w+"); //新建一个可写的文件

    fread( buf, sizeof(char), sizeof(buf),  stream);  //将刚刚FILE* stream的数据流读取到buf中
    fwrite( buf, 1, sizeof(buf), wstream );//将buf中的数据写到FILE    *wstream对应的流中,也是写到文件中
   
    pclose( stream ); 
    fclose( wstream );
   
    return 0;
(三)popen 与system
  system函数首先建立一个新的进程,然后在新的进程中执行exec函数去执行我们的shell命令,然后阻塞等待shell命令执行完后,返回到调用函数,system之所以要建立新的进程,是因为,exec函数的调用会结束调用进程,从调用exec函数开始,进程就切换到执行shell命令的进程,无法回到调用exec的进程继续执行程序的余下部分。所以system就会新建进程去执行exec,exec结束掉system创建进程,返回的时候,将返回值送给调用system的进程。换句话说,system建立的进程就是为了给exec函数结束用的。
   linux对system函数做了很好的优化,在system建立进程的时候,不会像建立普通进程那样消耗系统的资源,system进程只有用到数据的时候,系统才为其分配,如果只是单纯的执行shell命令,效率还是很高。
https://blog.csdn.net/liuxingen/article/details/47057539(建议查看这篇文章,很详细)
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中可以使用`system()`函数来执行shell命令,并获取命令执行结果的输出。 在使用`system()`函数时,需要传入要执行的shell命令作为参数。例如,可以通过以下方式来获取shell命令`ls`的输出结果: ```c #include <stdio.h> #include <stdlib.h> int main() { char command[100]; sprintf(command, "ls"); system(command); return 0; } ``` 在上述代码中,首先定义了一个字符数组`command`来存放要执行的命令,然后使用`sprintf()`函数将要执行的命令拷贝到`command`数组中。接下来,通过调用`system()`函数来执行`command`中存储的命令。 `system()`函数会执行指定的shell命令,并将命令的输出结果打印到终端上。 需要注意的是,`system()`函数的返回值是一个整数类型。如果命令执行成功,`system()`函数会返回一个非零值;如果命令执行失败,`system()`函数会返回零。 希望这个回答能够解决你的问题,如果还有其他疑问,请随时提问。 ### 回答2: C语言中的system()函数可以用来执行操作系统的shell命令,并获取命令的输出结果。 使用system()函数的方法很简单,只需在函数中传入要执行的shell命令即可。例如: ```c #include <stdio.h> #include <stdlib.h> int main() { char command[100]; printf("请输入要执行的shell命令:"); scanf("%s", command); system(command); return 0; } ``` 上述代码中,我们通过scanf()函数获取用户输入的shell命令,然后通过system()函数来执行该命令。执行结果将会在终端上显示出来。 如果想要获取system()函数执行结果的输出信息,可以将system()函数的返回值保存起来,然后通过一些方法来获取。 system()函数的返回值是一个整型值,它表示被执行的shell命令的返回状态。通常情况下,返回值为0表示命令执行成功,非零值表示命令执行失败。如果想要获取命令的输出结果,可以使用重定向的方式将输出结果保存到一个文件中,然后再读取这个文件的内容。 例如,我们可以将命令的输出结果保存到一个临时文件中,然后通过读取文件的方式获取输出结果。具体操作如下: ```c #include <stdio.h> #include <stdlib.h> int main() { char command[100]; printf("请输入要执行的shell命令:"); scanf("%s", command); // 创建临时文件 FILE *fp = fopen("temp.txt", "w"); // 执行命令并将输出结果重定向到临时文件中 if (fp != NULL) { freopen("temp.txt", "w", stdout); system(command); fclose(fp); } // 读取临时文件的内容 fp = fopen("temp.txt", "r"); if (fp != NULL) { char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); } // 删除临时文件 remove("temp.txt"); return 0; } ``` 上述代码中,我们首先创建一个临时文件temp.txt,然后通过freopen()函数将命令的输出结果重定向到该文件中。接着使用fgets()函数逐行读取文件内容,并通过printf()函数将结果输出到终端上。最后,使用remove()函数删除临时文件。这样就能够获取到命令的输出结果了。 ### 回答3: 在C语言中,我们可以使用system()函数来运行shell命令,并获取其输出。system()函数的原型如下: ```c int system(const char *command); ``` 其中,command参数是要执行的shell命令的字符串。当我们调用system()函数时,它会创建一个新的进程来执行shell命令,并返回命令的执行结果。 要获取shell命令的输出,我们可以通过重定向来实现。在shell中使用管道(|)可以将命令的输出重定向到另一个命令的输入。在C语言中,我们可以使用popen()函数来打开一个管道,并读取该管道上命令的输出。 下面是一个示例代码,演示如何使用system()函数和popen()函数获取shell命令的输出: ```c #include <stdio.h> #include <stdlib.h> int main() { char command[100]; sprintf(command, "ls -l | grep c"); // 要执行的shell命令 // 使用system()函数执行命令 system(command); // 使用popen()函数获取命令的输出 FILE *pipe = popen(command, "r"); if (pipe != NULL) { char buffer[100]; while (fgets(buffer, sizeof(buffer), pipe) != NULL) { printf("%s", buffer); } pclose(pipe); } else { printf("打开管道失败!"); } return 0; } ``` 在上面的示例代码中,我们首先使用system()函数执行了一个shell命令,然后使用popen()函数打开一个管道,并读取了该管道上的输出。最后,我们将输出打印到了屏幕上。 需要注意的是,使用system()函数和popen()函数执行shell命令时,要确保代码的安全性,避免注入攻击。可以使用字符串拼接函数(例如sprintf())来构建要执行的命令,以防止命令中包含用户输入的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值