子进程01

Posted LinuxCode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了子进程01相关的知识,希望对你有一定的参考价值。

1、施行一个外部程序,什么时候必须用fork+execl而不能直接system()  (http://www.myexception.cn/linux-unix/1341326.html

  1.1、system 是 fork/exec 的一个 wrapper, 灵活性不如 fork

  1.2、你想不阻塞,手动回收子进程的时候 waitpid
system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

看下system的实现,调用system后 父进程会阻塞在 waitpid上

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成功,则返回子进程的返回状态
}

2、

3、

4、

5、

 

以上是关于子进程01的主要内容,如果未能解决你的问题,请参考以下文章

片段之间的共享数据(父列表视图和子列表视图)

使用 (Child)FragmentManager 正确使用子子片段

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

共享元素转换在父片段和子片段之间不起作用(嵌套片段)

隐藏子屏幕/片段的android底部导航视图

八.多进程与多线程