一起talk C栗子吧(第一百零七回:C语言实例--线

一起talk C栗子吧(第七十八回:C语言实例--创建进程)


各位看官们,大家好,上一回中咱们说的是DIY ls命令续的例子,这一回咱们说的例子是:创建进程。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,关于进程的概念,我们简单做个简单的介绍:进程就是在系统中运行着的程序。比如我们正在使用的vim就是一个进程。我们可以使用ps命令查看一下,在终端中输入ps x命令,可以得到以下结果:

  PID TTY      STAT   TIME COMMAND
 1550 ?        Ssl    0:00 cinnamon-session --session cinnamon
 ...                              //其它系统相关的进程,不一一列出
 5276 pts/2    Ss     0:00 bash   //我们使用的终端也是一个进程
 5297 pts/2    S      0:00 vim    //我们使用的终端也是一个进程
 5298 pts/1    R      0:00 ps x   //ps命令本身也是一个进程

进程是一个比较抽象的概念,通过上面的实际展示,我想大家应该对进程有个直观的印象了吧。回想我当年听到进程这个东西的时候,还在使用windows,于是便打开任务管理器来观看进程。现在想想,当时这种做法也不错,如果有哪位看官在使用Windows系统,可以这样试试,哈哈。

我们在终端中输入某个命令,然后敲下回车时就创建了一个进程。刚才,我们使用ps命令查看进程就是在系统中创建了一个进程,进程名字叫:ps,也就是上面运行结果中的COMMAND这一列。进程的名字都是字母,有时候比较长(比如上面运行结果中的第一个进程名就比较长),因此,系统对进程进行编号管理。进程的编号叫作PID,也就是进程ID。上面运行结果中的第一列就是进程ID。进程ID是从0开始的整数,不同的系统对于创建的进程数量有限制,因此,进程ID是一个有限的整数。在这些ID中0和1是特殊的ID,系统保留下来,供自己使用。基于怎么使用,咱们以后再介绍。

看官们,现在知道如何创建进程了吗?“输入命令并且执行“。这位看官说的完全正确。接下来我们看看代码中是如何创建进程的。在实际的代码中使用fork()函数创建进程。该函数运行成功时会返回一个大于0的值,该值就是新创建进程的PID。如果运行失败,那么返回-1.接下来咱们举例子进行说明。

把下面的代码写入文件中保存,然后编译并且运行。

#include
#include

int main()
{
    pid_t pid;

    pid = fork();

    sleep(5);

    if(pid > 0)
        printf("pid is: %d n",pid);
    else
        return 0;

}

下面是程序的运行结果,请大家参考:

./s            //执行编译完的程序
pid is: 5456   //显示新创建进程的PID

重新打开一个终端,并且使用ps命令查看当前系统中的进程,结果如下:

  PID TTY      STAT   TIME COMMAND
 1550 ?        Ssl    0:00 cinnamon-session --session cinnamon
 ...                              //其它系统相关的进程,不一一列出
 5375 pts/1    S      0:00 vim Ex060_CreatProcess.c
 5434 pts/3    Ss     0:00 bash
 5455 pts/2    S      0:00 ./s   //该进程是我们编译后的程序s
 5456 pts/2    S      0:00 ./s   //从PID可以看出,该进程是程序s创建的新进程
 5457 pts/3    R      0:00 ps x

看官们,正文中就不写代码了,详细的代码放到了我的资源中,大家可以点击这里下载使用。

各位看官,关于创建进程的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解。


http://www.bkjia.com/Cyy/1083889.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1083889.htmlTechArticle一起talk C栗子吧(第七十八回:C语言实例--创建进程) 各位看官们,大家好,上一回中咱们说的是DIY ls命令续的例子,这一回咱们说的例子...

一起talk C栗子吧(第一百零七回:C语言实例--线程概述)


各位看官们,大家好,上一回中咱们说的是生产者与消费者问题的例子,这一回咱们说的例子是:线程概述。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们今天我们章回中的主角是线程。什么是线程呢?大家还记得我们在前面章回中介绍过进程的概念吧:进程就是在系统中运行着的程序。而线程是进程中的一个单元,通常叫它轻量级的进程

线程由进程来创建,它只有自己的栈,其它资源都是和创建它的进程一起共用。接下来我们通过具体的例子来看看线程的“庐山真面目”。

我们查看一下系统的进程。在终端中执行命令:ps x得到以下结果:

  PID TTY      STAT   TIME COMMAND
 1501 ?        Ssl    0:00 cinnamon-session --session cinnamon
 ... //省略其它进程的信息
 3375 ?        Sl     0:08 gnome-terminal
 3383 pts/1    Ss     0:00 bash
 3740 ?        Sl     0:02 /usr/lib/firefox/firefox  //这是firefox浏览器的进程
 3823 pts/1    R      0:00 ps x

大家从上面的运行结果中可以看到系统中运行着firefox进程,在终端中执行命令:ps xH篮球世界杯在哪买球,得到以下结果:

  PID TTY      STAT   TIME COMMAND
 1501 ?        Ssl    0:00 cinnamon-session --session cinnamon
 1501 ?        Ssl    0:00 cinnamon-session --session cinnamon
 1501 ?        Ssl    0:00 cinnamon-session --session cinnamon
 1501 ?        Ssl    0:00 cinnamon-session --session cinnamon
 ... //省略其它进程的信息
 3375 ?        Sl     0:08 gnome-terminal
 3375 ?        Sl     0:00 gnome-terminal
 3375 ?        Sl     0:00 gnome-terminal
 3375 ?        Sl     0:00 gnome-terminal
 3383 pts/1    Ss     0:00 bash
 3740 ?        Sl     0:02 /usr/lib/firefox/firefox  //下面都是firefox的线程
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        SNl    0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        SNl    0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3740 ?        Sl     0:00 /usr/lib/firefox/firefox
 3833 pts/1    R      0:00 ps xH

从上面的结果中大家可以看到进程firefox拥有很多线程。有看官说,你怎么知道呢?其实从PID这一列就能看到,它们都拥有相同的PID。这也再次说明线程和创建它的进程共用资源。严格点说,线程是没有像进程PID一样的标记,上面结果显示的是进程的PID。我们可以使用ps md 3740命令查看PID为3740进程的线程,结果如下:

 ps mp 3740                      //查看PID为3740进程的线程
 PID TTY      STAT   TIME COMMAND
 3740 ?        -      0:02 /usr/lib/firefox/firefox
    - -        Sl     0:01 -  //下面显示的都是firefox的线程
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        SNl    0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        SNl    0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -
    - -        Sl     0:00 -

从上面的运行结果中可以看到PID为3740进程的线程是没有PID的。

各位看官,关于线程概述的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


http://www.bkjia.com/Cyy/1094196.htmlwww.bkjia.comtruehttp://www.bkjia.com/Cyy/1094196.htmlTechArticle一起talk C栗子吧(第一百零七回:C语言实例--线程概述) 各位看官们,大家好,上一回中咱们说的是生产者与消费者问题的例子,这一回咱...

本文由美洲杯在哪买球发布于计算机教程,转载请注明出处:一起talk C栗子吧(第一百零七回:C语言实例--线

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。