美文网首页
Linux中的进程控制

Linux中的进程控制

作者: ahqrt | 来源:发表于2018-12-04 22:21 被阅读0次

我们知道,程序就是一个包含可执行代码的文件,是一个静态的文件。
进程就是可执行程序的一次执行过程,是一个动态的概念,在Linux系统中所有运行的东西都可以称之为进程。

进程的基本状态三种:运行态、就绪态和阻塞态(或等待态)。

下面我们来介绍一下进程控制中的相关函数:
1、fork函数

fork函数的功能是产生子进程,子进程会完全复制父进程的资源,并且子进程的执行完全独立于父进程,调用一次会有两个返回值,在子进程里面返回0,在父进程里面返回子进程的pid号,fork函数存在于头文件#include<unistd.h>
一个简单的例子:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(){
    int   p_id;
    p_id=fork( );
    if (p_id==0)
        printf("child  process\n");
    else
        printf("parent process\n");
}

在这里需要注意的是fork函数创建进程以后父子进程所随机运行的,并没有谁先谁后一说。所以如果父进程先结束,子进程就变成了孤儿进程,这对于一个程序来说是不能允许的错误,所以如果希望父进程在子进程结束后再结束,可以使用wait函数:

pid_t wait (int * status);     (头文件: wait.h)

wait函数会“暂停”目前进程的执行,直到有信号来到或子进程结束
如果在调用 wait()时子进程已经结束,则 wait()会“立即”返回子进程结束状态值,如果有错误发生则返回返回值-1。失败原因存于 errno 中。
子进程的结束状态值(如exit函数中的值)会存放在参数 status 中, 而wait函数的返回值是子进程的进程号

waitpid:pid_t waitpid(pid_t pid, int * status, int options);

等待指定的子进程结束
简单的例子:

int main()
{   pid_t pc, pr;
    pc=fork();
    if(pc<0) printf("Error fork.\n");
    else if(pc==0){ 
            sleep(10);  
            exit(0);
    }  
    else{ 
            pr = waitpid(pc, NULL, 0);  
            if(pr==pc)  
                printf("Get child %d\n",pr);
            else
                printf("some error occured.\n");
    }
}
这样父进程就会在子进程执行结束以后再执行。
下面我们来探讨一下更高级的问题,如何来创建多个子进程呢,我们知道父子进程都会执行除了进程控制的其他语句,如果我们直接调用fork函数就会创建数不清的进程,比如:
int main(){
    int   p_id;
    p_id=fork( );
if (p_id==0)
        printf("child  process 1\n");
    else
    {
        wait();
        printf("parent process 1\n");
    }
    p_id=fork( );
    if (p_id==0)
        printf("child  process 2\n");
    else
    {  
        wait();
        printf("parent process 2\n");
    }
}

那么如何避免这种情况呢,最简单的方法就是使用进程链:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
    int i;
    pid_t child_pid;
    for(i=1;i<3;i++)
    { 
       child_pid = fork();
        if( child_pid==0 )
            { printf( "do something \n");  return 0;}
        else{ wait(); }
    }
    return 0;

}

我们用一个return语句来退出if语句执行下一个进程创建函数,这样就避免了子进程在创建子进程的操作。

相关文章

  • Linux中的进程控制

    我们知道,程序就是一个包含可执行代码的文件,是一个静态的文件。进程就是可执行程序的一次执行过程,是一个动态的概念,...

  • Linux前台进程与后台进程的区别

    (1).Linux前台进程与后台进程的区别 前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个...

  • 进程控制块PCB

    进程控制块 每一个进程内核中都有一个进程控制块(PCB)来维护进程相关的信息,linux内核的进程控制块时 tas...

  • Linux 进程的控制

    准备工作 创建 test.sh,内容如下 赋予执行权限 top 查看该进程信息 10956是test.sh运行的进...

  • shell第4章进程和服务

    Linux中的进程: ps命令 ps -aux参数解释: Linux中的会话和作业: 中断进程: Linux中的日...

  • 5.进程控制

    进程控制 这一节主要介绍Unix系统的进程控制,包括创建新进程、执行进程和进程终止。由于前面Linux学习部分有了...

  • Linux基础知识之--守护进程

    概述 也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并...

  • 2018-06-04

    Linux进程的睡眠和唤醒 1 Linux进程的睡眠和唤醒 在Linux中,仅等待CPU时间的进程称为就绪进程,它...

  • linux进程

    linux进程包含如下几个方面:1:进程的控制(创建,等待子进程终止,执行程序,退出)2:守护进程(什么是守护进程...

  • Linux 多进程 命名管道

    [Linux]Linux Shell多进程并发以及并发数控制[https://blog.csdn.net/yewe...

网友评论

      本文标题:Linux中的进程控制

      本文链接:https://www.haomeiwen.com/subject/zfkbcqtx.html