Linux多进程程序设计

用到的函数的功能主要有获取进程id、创建进程、进程退出、进程等待、执行程序。 
获取进程id:getpid(),getppid() 
创建进程:fork(),vfork() 
进程退出:exit() 
进程等待:wait() 
执行程序:exec(),system()

getpid函数

原型:pid_t getpid(void)
头文件:<unistd.h><sys/types.h>
功能:返回调用该函数的进程id,且该函数总是运行成功

getppid函数

原型:pid_t getppid(void)
头文件:<unistd.h><sys/types.h>
功能:返回调用该函数的进程的父进程id,且该函数总是运行成功

fork函数

原型:pid_t fork(void)
头文件:<unistd.h>
功能:创建一个子进程。成功则在父进程返回子进程PID,在子进程返回0;失败返回-1.

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
    pid_t pid;
    pid=fork();
    if(pid==0)
    {
        printf("this is child program,the return is %d\n",pid);
    }
    else
    {
        printf("this is father program,the return is %d\n",pid);
    }
    exit(0);
}

这里写图片描述 
使用fork函数后,父进程就会产生一个子进程,并且父进程和子进程都会执行fork函数后的代码,直至退出进程。由于在父进程返回子进程PID,在子进程返回0,因此可利用该返回值,让父进程和子进程执行不同功能。子进程打印“this is child program,the return is 0”在shell提示符后面的原因为先执行父进程,执行完父进程后操作系统弹出shell提示符,然后在执行子进程。

vfork函数

原型:pid_t vfork(void)
头文件:<unistd.h><sys/types.h>
功能:创建一个子进程,并阻塞父进程。成功则在父进程返回子进程PID,在子进程返回0;失败返回-1.

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
void main()
{
    pid_t pid;
    pid=vfork();
    if(pid==0)
    {
        printf("this is child program,the return is %d\n",pid);
    }
    else
    {
        printf("this is father program,the return is %d\n",pid);
    }
    exit(0);
}

这里写图片描述  
先执行子进程,再执行父进程。 
fork函数与vfork函数都用于创建子进程,但两者区别有两点: 
① fork:子进程拥有独立的数据段,堆栈。 
vfork:子进程与父进程共享数据段,堆栈。 
② fork:父、子进程的执行次序不确定 
vfork:子进程先运行,父进程后运行
父进程可采用return或者exit()函数退出进程; 
子进程只能采用exit()函数退出进程,其中exit(0)表示正常退出,exit(1)表示异常退出

wait函数

原型:pid_t wait(int *status)
头文件:<sys/wait.h><sys/types.h>
功能:挂起调用它的进程,直到该进程的一个子进程结束。成功则返回结束的那个子进程的ID,失败返回-1
参数:status若不为NULL,则用于记录子进程的退出状态

执行进程的函数为exec,exec是一个函数族,共有6个:execl,execv,execle,execve,execlp,execvp,以execl为例进行说明

execl函数

原型:int execl(const char* pathname,const char* arg,...)
头文件:<unistd.h>
功能:运行可执行文件,并且原进程的代码不再执行,只执行新的代码。成功时不返回,失败时返回-1.
参数:pathname为要运行的可执行文件的路径
     arg及后面的参数作为可执行文件的参数,并以一个NULL作为参数的结束标志。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
void main()
{
    pid_t pid;
    pid=fork();
    if(pid==0)
    {
        execl("/bin/ls","ls","/home",NULL);
        printf("this is child program,the return is %d\n",pid);
    }
    else
    {
        wait(NULL);
        printf("this is father program,the return is %d\n",pid);
    }
    exit(0);
}

这里写图片描述 
由上可看出,使用execl函数后,原进程代码不再执行,转为执行新的代码。 
fork创建一个新的进程,产生一个新的PID。 
exec保留原有的进程,执行新的代码。

system函数

原型:int system(const char* command)
头文件:<stdlib.h>
功能:执行一条shell指令,该函数会产生子进程





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值