system函数和popen函数

system函数

#include <stdlib.h>
*int system(const char command);
system函数在linux中的源代码:

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

如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。

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

int main(){
        //pid_t getpid(void);
        pid_t pid;
        int data;

        while(1){
                printf("please input a data\n");
                scanf("%d",&data);
                if(data == 1){
                        pid = fork();
                        if(pid > 0){
                                wait(NULL);
                        }
                        if(pid == 0){
                                //execl("./myChange","myChange",NULL);
                                system("./myChange");
                        }

                }else{
                        printf("wait,no request\n");
                }
        }
        return 0;
}

system使用起来会比exec更简洁,另外exec在运行时跳入新的可执行程序之后不会再运行之后的代码,而system调用结束后,后续的代码还会执行:

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

int main(void){
        printf("before execl\n");
        //int execl(const char *path, const char *arg, ...);
        //if(execlp("ls","ls","-l",NULL) == -1)
        if(system("ls"))
        {
                printf("execl failed\n");

                perror("why");
        }
        printf("after execl\n");
        return 0;
}

在这里插入图片描述
调用完可执行程序后,还会运行之后的代码。

popen函数

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

参数说明

command:是一个指向以NULL结束的shell命令字符串的指针。这行命令与system类似,传到bin/sh并使用-c标志,shell将执行这个命令。
mode:r——标准输出
w——标准输入

返回值

如果调用成功,返回值是一个FILE*,如果失败返回NULL。相比于system来说可以捕获返回值

读取command指向的数据到popen开辟的管道当中,并将管道中的数据读取到ret中:

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

int main(){
        char ret[1024] = {0};
        FILE* fp;

        fp = popen("ls","r");
        //size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        int nread = fread(ret,1,1024,fp);

        printf("read ret %d byte,ret =\n %s\n",nread,ret);
        return 0;
}

运行结果:
在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值