ARM linux进程控制相关API

来源:互联网 发布:阿里云宽带 编辑:程序博客网 时间:2024/05/20 14:43

1.fork函数

      一个现存进程调用f o r k函数是U N I X内核创建一个新进程的唯一方法。fock 的意思是复制进程, 就是把当前的程序再加载一次, 不同之处在,加载后,所有的状态和当前进程是一样的(包括变量)。 fock 不象线程需提供一个函数做为入口, fock后,新进程的入口就在 fock的下一条语句。

--------------------------------------------------------------------------------

#i nclude <sys/types.h>
#i nclude <unistd.h>
pid_t fork(void);
                                          返回:子进程中为0,父进程中为子进程I D,出错为-1

--------------------------------------------------------------------------------

由f o r k创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程 I D。将子进程I D返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程I D。f o r k使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用g e t p p i d以获得其父进程的进程I D (进程ID 0总是由交换进程使用,所以一个子进程的进程I D不可能为0 )。
子进程和父进程继续执行f o r k之后的指令。子进程是父进程的复制品。例如,子进程获得父进程数据空间、堆和栈的复制品。注意,这是子进程所拥有的拷贝。父、子进程并不共享这些存储空间部分。如果正文段是只读的,则父、子进程共享正文段。
现在很多的实现并不做一个父进程数据段和堆的完全拷贝,因为在 f o r k之后经常跟随着e x e c。作为替代,使用了在写时复制( C o p y - O n - Write, COW)的技术。这些区域由父、子进程共享,而且内核将它们的存取许可权改变为只读的。如果有进程试图修改这些区域,则内核为有关部分,典型的是虚存系统中的“页”,做一个拷贝。

2.exec函数簇

当进程调用一种e x e c函数时,该进程完全由新程序代换,而新程序则从其m a i n函数开始执行。因为调用e x e c并不创建新进程,所以前后的进程I D并未改变。e x e c只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
有六种不同的e x e c函数可供使用,它们常常被统称为e x e c函数。这些e x e c函数都是U N I X进程控制原语。用f o r k可以创建新进程,用e x e c可以执行新的程序。e x i t函数和两个w a i t函数处理终止和等待终止。这些是我们需要的基本的进程控制原语。在后面各节中将使用这些原语构造
#include <unistd.h>

int execl(const charp a t* h n a m e, const char a* rg 0, ... /* (char *) 0 */);
int execv(const charp a t* h n a m e, char *consta rgv [] );
int execle(const charp a t* h n a m e, const char a* rg 0, ...
/* (char *)0, char *cones nt v p [] */);
int execve(const charp a t* h n a m e, char *consta rgv [], char *consten vp [] );
int execlp(const charf i l e* n a m e, const char a* rg 0, ... /* (char *) 0 */);
int execvp(const charf i l e* n a m e, char *consta rgv [] );
六个函数返回:若出错则为- 1,若成功则不返回

这些函数之间的第一个区别是前四个取路径名作为参数,后两个则取文件名作为参数。

3.exit和_exit函数

exit和_exit函数用于正常终止一个程序: _exit立即进入内核, exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I/O流等),然后进入内核,它们最大的区别就在于exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区中的内容写回文件。
相关函数: exit, wait, abort
表头文件: #include <unistd.h>
函数定义: void _exit(int status)
函数说明: _exit()用来立刻结束目前进程的执行,并把参数status返回给父进程,并关闭未关闭的文件。此函数调用后不会返回,并且会传送SIGCHLD信号给父进程,父进程可以由wait函数取得子进程结束状态
返回值  :无
附加说明:_exit()不会处理标准I/O缓冲区,如要更新缓冲区请使用exit()
4.wait和waitpid函数
      wait系统调用挂起当前执行中的进程,直到它的一个子进程终止。waitpid挂起当前进程的执行,直到指定的子进程状态发生变化。默认,waitpid只等待终止状态的子进程,但这种行为可通过选项来改变。waitid系统调用对于等待哪个子进程状态改变提供了更精确的控制。 
      子进程已终止,父进程尚未对其执行wait操作,子进程会转入“僵死”状态。内核为“僵死”状态的进程保留最少的信息量(进程标识,终止状态,资源使用信息),过后父进程执行wait时可以获取子进程信息。只要僵死的进程不通过wait从系统中移去,它将会占据内核进程表中的一个栏位。如果进程表被填满,内核将不能再产生新进程。如果父进程已终止,它的僵死子进程将由init进程收养,并自动执行wait将它们移去。
wait(等待子进程中断或结束)
表头文件
     #include<sys/types.h>
     #include<sys/wait.h>
定义函数 pid_t wait (int * status);
函数说明
    wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数 status 可以设成 NULL。      
    子进程的结束状态值请参考waitpid( )如果执行成功则返回子进程识别码(PID),如果有错误发生则返回返回值 -1。失败原因存于 errno 中。
waitpid(等待子进程中断或结束)
表头文件
      #include<sys/types.h>
      #include<sys/wait.h>
定义函数  pid_t waitpid(pid_t pid,int * status,int options);
函数说明
    waitpid()的作用和wait()一样,但它并不一定要等到第一个终止的子进程。waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 wait()时子进程已经结束,则 wait()会立即返回子进程结束状态值。               
   子进程的结束状态值会由参数 status 返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数 status 可以设成 NULL。参数 pid 为欲等待的子进程识别码,其他数值意义如下:
    pid<-1 等待进程组识别码为 pid 绝对值的任何子进程。
    pid=-1 等待任何子进程,相当于 wait()。            
    pid=0     等待进程组识别码与目前进程相同的任何子进程。       
    pid>0     等待任何子进程识别码为 pid 的子进程。
    参数 option 可以为 0 或下面的 OR 组合:
    WNOHANG 如果没有任何已经结束的子进程则马上返回, 不予以等待。
    WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
    子进程的结束状态返回后存于 status,底下有几个宏可判别结束情况:
    WIFEXITED(status)如果子进程正常结束则为非 0 值。
    WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
    WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
    WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
    WIFSTOPPED(status) 如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
    WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。
    如果执行成功则返回子进程识别码(PID),如果有错误发生则返回返回值-1。失败原因存于 errno 中。
原创粉丝点击