Linux进程控制-进程创建/终止/等待&封装fork/wait&函数popen/system

一、进程创建, 终止,等待(使用代码实现)

1、进程创建

(1)fork函数创建进程

fork调用格式如下:

#include

pid_t pid = fork();

返回值:子进程返回0,父进程返回子进程的pid,创建失败返回-1

编写代码创建进程如下:

#include 
#include 
#include 

int main()
{
    pid_t pid;
    printf("before: pid is %d\n",getpid());
    if((pid = fork()) == -1)//fork()子进程返回0,父进程返回子进程pid
    {   
        perror("fork");
        exit(1);
    }   
    printf("after:pid is %d,fork return is %d\n",getpid(),pid);
    sleep(1);
    return 0;
}

运行结果如下:

(2)vfork创建进程

fork与vfork使用区别:

        1)vfork创建的子进程与父进程共享地址空间,fork的子进程具有独立的地址空间;

        2)vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度。

#include 
#include 
#include 

int main()
{
    int flag = 100;
    pid_t pid = vfork();
    if(pid == -1) 
    {   
        perror("vfork()");
        exit(1);
    }   
    if(pid == 0)//child
    {   
        flag = 200;
        printf("child flag is %d\n",flag);
        exit(0);
    }   
    else//parent
    {   
        printf("parent flag is %d\n",flag);
    }   
    return 0;
}

可以看见:子进程改变了父进程的变量值,因为子进程在父进程的地址空间中运行。

我们用fork函数验证一下,看fork出来的子进程是否也可以修改父进程的变量值:

#include 
#include 
#include 

int main()
{
    int flag = 100;
    pid_t pid = fork();
    if(pid == -1) 
    {   
        perror("fork()");
        exit(1);
    }   
    if(pid == 0)//child
    {   
        flag = 200;
        printf("child flag is %d\n",flag);
        exit(0);
    }   
    else//parent
    {   
        sleep(1);
        printf("parent flag is %d\n",flag);
    }   
    return 0;
}

运行结果可见,并不可以噢。因为子进程有自己独立的地址空间。

2、进程终止

(1)进程退出的三种场景

代码运行完毕,正常正确;

代码运行完毕,结果不正确;

代码异常提出。

(2)进程常见的退出方法

  • 1)正常终止(可以用echo $?查看进程退出码)

从main函数返回;

调用exit;

_exit;

  • 2)异常退出

ctrl+c   信号终止

(3)终止进程场景演示如下

  • 从main函数返回终止进程场景演示如下:
#include 

int main()
{

你可能感兴趣的:(Linux,进程创建,进程等待,进程终止)