进程(五)system函数 popen函数

一、system函数 

system()函数的返回值如下:
成功,则返回进程的状态值;
当sh不能执行时,返回127;失败返回-1;

为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作:

1.fork一个子进程;
2.在子进程中调用exec函数去执行command;
3.在父进程中调用wait去等待子进程结束。 对于fork失败,system()函数返回-1。 
如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。
 (注意,command顺利执行不代表执行成功,比如command:"rm debuglog.txt",不管文件存不存在该command都顺利执行了)
 如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127. 如果command为NULL,则system()函数返回非0值,一般为1。
system10.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
        pid_t pid;
        int data = 10;
        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("./changeData","changeData","TEST.CONFIG",NULL);
                                system("./changeData TEST.CONFIG");
                                exit(0);

                        }
                }else{
                        printf("wait , do nothing\n");
                }
        }
        return 0;
}

 运行结果为:

system11.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
//函数原型:int execl(const char *path, const char *arg, ...);

int main(void)
{
    printf("this is pro system date\n");


    if(system("ps") == -1)
    {
        printf("execl failed!\n");

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

 运行结果为:

补充说明:

如果system里面内容输入错误 会直接弹出提示你输错的内容 = sh -c 内容 

https://www.cnblogs.com/cmt/p/14553189.html

二、popen函数

比system在应用中的好处:可以获取运行的输出结果
函数原型:

  #include “stdio.h”

  FILE popen( const char command, const char* mode )

参数说明:

  command: 是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用 -c 标志,shell 将执行这个命令。

  mode: 只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。
如果 type 是 “r” 则文件指针连接到 command 的标准输出;如果 type 是 “w” 则文件指针连接到 command 的标准输入。

返回值:

  如果调用成功,则返回一个读或者打开文件的指针,如果失败,返回NULL,具体错误要根据errno判断

  int pclose (FILE* stream)

  参数说明:

  stream:popen返回的文件指针

  返回值:

  如果调用失败,返回 -1

作用:

  popen() 函数用于创建一个管道:其内部实现为调用 fork 产生一个子进程,
执行一个 shell 以运行命令来开启一个进程这个进程必须由 pclose() 函数关闭。 
popen.c
#include <stdio.h>
#include <string.h>
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

int main(void)
{
    FILE *fp;
    char ret[1024] = {0};
    fp = popen("ps","r");

//    if(fp == NULL){
  //      return 0;
   // }

    int nread = fread(ret, 1, 1024, fp);

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

运行结果: 

 如果没有printf("read ret %d byte,ret = %s\n",nread,ret);

就什么都打印不出来

说明popen是可以可以获取运行的输出结果

https://blog.csdn.net/libinbin_1014/article/details/51490568

猜你喜欢

转载自blog.csdn.net/weixin_46016743/article/details/115033920
今日推荐