linux system函数的学习

来源:互联网 发布:linux 脚本 while 死 编辑:程序博客网 时间:2024/06/07 00:55

1. system是库函数还是系统调用?
system是一个库函数,system会fork一个child process,然后在这个child process中去执行shell命令。
如果你的程序需要调用system函数,你需要
#include <stdlib.h>
system函数的原型是
int system(const char *command);

2. system是同步函数吗?
所谓同步函数应该就是函数返回了,函数也就真正意义上执行结束;
而异步函数则是通常需要切换到另一个线程去执行,函数返回时不代表函数执行完成。
依据以上的定义,我们结合system函数的代码实现:
if (0 == fork())
{
    execl("/bin/sh", "sh", "-c", "cmd", (char*)0);
    _exit(127);
}
else
{
    while(waitpid(pid, &status, 0)<0)
    {
        if (errno != EINTER)
        {
            status = -1;
            break;
        }

    }
}
从上面伪代码可以看到,当parent process fork一个child process执行shell command时,
parent process会一直等待child process执行结束,直到child process结束时parent process
才会从system函数中返回。
这说明两件事:(1)system函数是同步函数;(2)parent process一定要成功调用waitpid后,
kernel才会回收child process的process descriptor。

3. 既然system是一个同步函数,那如果需要异步的执行一个shell command,要如何做?
通常为了让系统能够顺畅的运行,我们会将一些需要执行很长时间才能完成同时也不会
影响到用户体验的动作可以放到后台执行。这里所谓的后台可以认为是对用户透明的,
用户并不知道也不需要知道这件事。
所以如果只需要fork一个child process在后台做事而不要影响到parent process的话,
可以使用类似于下面的代码来实现:
if (0 == fork())
{
    execl("/bin/sh", "sh", "-c", "cmd", (char*)0);
    _exit(127);
}
else
{
    printf("\nparent process\n");
}
这样parent process就不会一直卡在那里了。
如果这样做,那parent process也必须要去monitor SIG_CHILD这条signal。
当收到child process结束的signal时要去调用waitpid,这样做的目的是避免
child process结束后变成zombie process。

转自:http://blog.csdn.net/boyxulin1986/article/details/10962319

0 0
原创粉丝点击