zoukankan      html  css  js  c++  java
  • linux系统调用system()函数详解

    转载于:https://blog.csdn.net/sk983671939/article/details/79726854

    1、system()函数功能简介

    int system(const char *command)
    system()函数调用/bin/sh来执行参数指定的命令,/bin/sh 一般是一个软连接,指向某个具体的shell,比如bash,-c选项是告诉shell从字符串command中读取命令; 在该command执行期间,SIGCHLD是被阻塞的,好比在说:hi,内核,这会不要给我送SIGCHLD信号,等我忙完再说; 在该command执行期间,SIGINT和SIGQUIT是被忽略的,意思是进程收到这两个信号后没有任何动作。

    2、system()函数源码

    system()函数源码实现:

    int system(const char * cmdstring)
    {
    pid_t pid;
    int status;
    if(cmdstring == NULL)
    {
    return (1); //如果cmdstring为空,返回非零值,一般为1
    }
    if((pid = fork())<0)
    {
    status = -1; //fork失败,返回-1
    }
    else if(pid == 0)
    {
    execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
    _exit(127); // exec执行失败返回127,注意exec只在失败时才返回现在的进程,成功的话现在的
    进程就不存在啦~~
    }
    else //父进程
    {
    while(waitpid(pid, &status, 0) < 0)
    {
    if(errno != EINTR)
    {
    status = -1; //如果waitpid被信号中断,则返回-1
    break;
    }
    }
    }
    return status; //如果waitpid成功,则返回子进程的返回状态
    }
    仔细看完这个system()函数的简单实现,那么该函数的返回值就清晰了吧,那么什么时候system()函数返回0呢?只在command命令返回0时。
    3、system()函数返回值

    system()函数执行了三步操作:

    fork一个子进程;
    在子进程中调用exec函数去执行command;
    在父进程中调用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.
    system()函数用起来很容易出错,返回值太多,而且返回值很容易跟command的返回值混淆。这里推荐使用popen()函数替代,关于popen()函数的简单使用可以自己查下资料。

    popen()函数较于system()函数的优势在于使用简单,popen()函数只返回两个值: 成功返回子进程的status,使用WIFEXITED相关宏就可以取得command的返回结果; 失败返回-1,我们可以使用perro()函数或strerror()函数得到有用的错误信息。
    ————————————————
    版权声明:本文为CSDN博主「香蕉的巴拉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/sk983671939/article/details/79726854

  • 相关阅读:
    PHP时间戳常用转换
    redis基本指令
    P2501 [HAOI2006]数字序列
    P2679 子串
    P2759 奇怪的函数
    P6823 「EZEC-4」zrmpaul Loves Array
    P6631 [ZJOI2020] 序列
    P2887 [USACO07NOV]Sunscreen G
    P3287 [SCOI2014]方伯伯的玉米田
    拓展欧几里得算法揭秘
  • 原文地址:https://www.cnblogs.com/baiduboy/p/15222283.html
Copyright © 2011-2022 走看看