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

本文详细介绍了Linux进程控制,包括使用fork和vfork创建进程,进程的正常与异常终止,wait和waitpid的使用,以及封装fork和wait的process_create函数。此外,还对比分析了popen和system函数与fork的区别,如popen的非阻塞特性及需要手动回收子进程等。
摘要由CSDN通过智能技术生成

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

1、进程创建

(1)fork函数创建进程

fork调用格式如下:

#include <unistd.h>

pid_t pid = fork();

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

编写代码创建进程如下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

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 <stdio.h>
#include <unistd.h>
#include <stdlib.h>

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 <stdio.h>
#include <unistd.h>
#include <stdlib.h>

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 <stdio.h>

int main()
{
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值