Linux —system、popen函数用法

Linux —system、popen函数用法

一、system()函数
 system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字 符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。
 
1、原型:

#include <stdlib.h>

int system(const char *command);

2、返回值:

如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。
如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此最好能再检查errno 来确认执行成功。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
    if(system("main aa bbb") == -1){
        printf("system faill\n");
        perror("why:");
     }

    printf("system susess\n");

    system("pause");
    return 0;
}

运行结果:

CLC@Embed_Learn:~$ gcc system.c
CLC@Embed_Learn:~$ ./a.out
argv[0]=main
argv[1]=aa
argv[2]=bbb
sh: 1: pause: not found
system susess
sh: 1: pause: not found

二、popen()函数
相比system/exec族函数好处,可以将程序运行的结果放到一个管道中方便捕获信息。

原型:

#include <stdio.h>

 FILE *popen(const char *command, const char *type);

 int pclose(FILE *stream);

参数说明:
command: 是指向以NULL结束的shell命令字符串的指针。
type: 权限;读、写(w、r)。

返回值:
如果调用成功,返回一个读\写指针,否则返回NULL

demo测试:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{

      char readbuf[1024];
      FILE *fd;

      fd =  popen("ps","r");

      fread(readbuf,1024,1,fd);
      printf("readbuf=\n%s\n",readbuf);
      pclose(fd);
    
      system("pause");
      return 0;
}

运行结果:

CLC@Embed_Learn:~$ ./a.out
readbuf=  
 PID TTY          TIME CMD
 2870 pts/0    00:00:01 bash
 9024 pts/0    00:00:00 a.out
 9025 pts/0    00:00:00 sh
 9026 pts/0    00:00:00 ps

sh: 1: pause: not found

上一篇:【批处理】子文件夹压缩包和指定后缀名文件


下一篇:Java 中UDP原理机制及实现方式介绍(建议阅读者阅读前了解下Java的基础知识,一方便理解)