(八)多进程程序设计

获取进程id

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函数后的代码,直至退出进程

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:子进程先运行,父进程后运行

父进程可采用return或者exit()函数退出进程; 
子进程只能采用exit()函数退出进程,其中exit(0)表示正常退出,exit(1)表示异常退出

进程退出

exit函数

函数原形 

 void exit(int status);

函数功能: 

退出程序

所属头文件:   

<stdlib.h>

进程等待

wait函数

函数原形 

pid_t wait(int *status)

函数功能: 

挂起调用它的进程,直到该进程的一个子进程结束。

所属头文件:

<sys/wait.h><sys/types.h

返回值:

成功则返回结束的那个子进程的ID,失败返回-1

参数说明:    

status若不为NULL,则用于记录子进程的退出状态

执行程序

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)

函数功能: 

行一条shell指令,该函数会产生子进程

所属头文件:   

<stdlib.h>

返回值:

如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。
若参数string为空指针(NULL),则返回非零值。
如果 system()调用成功则最后会返回执行shell命令后的返回值,

参数说明:

执行shell 命令

两者区别

  • system:启动另外一个应用之后,新应用的进程独立,当前进程也活着。即有两个互不影响的进程。
  • execl:启动另外一个应用之后,新应用的进程即是当前进程。进程数是一个。

猜你喜欢

转载自blog.csdn.net/qq_34863439/article/details/89055389
今日推荐