linux进程相关函数

来源:互联网 发布:网络发票发票分配 编辑:程序博客网 时间:2024/05/08 12:10

1.获取进程号

  • 获取当前进程号
    函数名 :getpid
    原型:pid_t getpid(void)
    所属库文件:sys/types.h 、unistd.h
    参数:无参数
    功能:返回当前进程ID
    返回值:成功返回当前ID,该函数always successful

  • 获取父进程号:
    函数名 :getppid
    原型:pid_t getppid(void)
    所属库文件:sys/types.h 、unistd.h
    参数:无参数
    功能:返回当前进程ID
    返回值:成功返回当前ID,该函数always successful

2.进程创建相关函数

  • fork(vfork)
    函数原型:pid_t fork(void)
    头文件:sys/types.h unistd.h
    功能:在当前进程中创建一个进程
    返回值:返回值为0,失败-1或者errno
    参数:无参数

  • 进程的执行过程的理解

程序:

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unstd.h>void main(){     fork();     printf("123");}

该程序执行的结果是打印两次123
要解释这个结果就要理解进程的执行过程,首先该函数这个主进程要运行,因为子进程是主进程的一部分,所以子进程要执行一次(第一次执行);然后主进程创建的一个子进程,这个子进程本身要执行一次(第二次执行)。因此会打印两次123.

注意:子进程的代码是fork函数以下部分。

  • 关于fork(vfork)的返回值的问题:
    其实成功创建一个进程后,fork会返回给父进程其所创建进程的进程号,然后返回创建成功的标志值0。
    程序:
#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unstd.h>void main(){     if((fork())>0//父进程空间     {          printf("child = %d\n",getpid());          printf("ppid = %d\n",getppid());          printf("parents  process");          exit0);     }     else//子进程空间     {          printf("child = %d\n",getpid());          printf("ppid = %d\n",getppid());          printf("child  process");          exit0);     }}

结果:
if : 第一次打印的是当前进程的进程号和父进程号(bash进程)

else:第二次打印的是创建进程的进程号和其父进程号(改程序的主进程)

总结:通过以上结果可以证明成功创建一个进程后,创建的这个进程会返回给父进程所创建的这个进程的进程号,返回0进入子进程。通过这一点也可以区分父进程和子进程的执行空间。

  • fork与vfork的区别
fork vfork 子进程拥有独立的数据段,堆栈 子进程与父进程共享数据段,堆栈 父子进程的执行次序不确定 子进程先运行,父进程后运行

3.进程的退出

  • 父进程既可使用exit(0)退出也可以使用return(0)退出

  • 子进程只能使用exit(0)退出

4.进程的等待函数

  • wait():
    函数原型:pid_t wait(int *status)
    功能:调用挂起他的进程,知道子进程结束,然后才接着运行该进程。
    返回值:成功返回终止的那个进程的id,失败返回-1.
    参数:记录进程退出的状态(是正常退出还是异常退出)。

5.执行进程

execl():

所属库:unistd.h
函数原型:int execl(const char *path, const char *arg, ....)
函数功能:运行可执行文件
返回值:成功无返回值,失败返回-1或者错误信息的指针
参数:path:可执行文件的路径 arg:可执行文件所需要的参数

程序实例:

#include <stdio.h>#include <unistd.h>#include <sys/types.h>void main(){     if( !(fork()) )     {          execl("/bin/ls","/home",NULL);//列出home目录下的文件和文件夹          exit(0);     }}

注意:execlfork的对比

execl fork 保留原有的进程,执行新的代码。也就是覆盖原有的进程映像,进一步理解就是,占用原有进程的巢穴,将其代码段覆盖掉。 是创建一个新的进程。即产生一个新的进程映像。
0 0
原创粉丝点击