Linux create process and thread instance | Linux创建进程,线程实例

/ 2021-04-22 / 300 Words/has been Read   Times


环境准备 #

  • 本文采用的操作系统是CentOS7
  • 需要事先安装好gcc和g++环境,分别用来编译c和c++代码

安装命令如下[1]

# 安装gcc
yum install gcc
#安装 g++
yum install gcc-c++

这里yum为centos的安装命令,Ubuntu的安装命令为apt-get。

进程实例 #

1.实例描述

首先在linux下编写一个应用程序,命名为an_ch2_1b。这个程序不断地输出如下行:

Those output come from child,[系统时间]

另外写一个应用程序,命名为an_ch2_1a。这个程序创建一个子进程,执行an_ch2_1b。

2.具体步骤

首先创建一个索引目录exer用来存放脚本代码,然后转到exer目录下,使用指令

cat > an_ch2_1b.cpp << EOF

来创建C++脚本文件,EOF表示在文件中输入EOF退出。

img

输入an_ch2_1b.cpp的代码如下:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
using namespace std;
string getTime() // 获取系统时间
{
    time_t timep;
    time(&timep);
    char tmp[64];
    strftime(tmp, sizeof (tmp), "%Y-%m-%d%H:%M:%S" ,localtime(&timep));
    return tmp;
}
int main()
{
    while ( true )
    {
        string tmn = getTime();
        cout << "Those output come from child," << tmn << endl;
        sleep(1); // 为了便于截屏使用sleep() 函数延迟输出
    }
return 0;
}

编写完成之后就需要对源代码进行编译,输入如下指令进行编译

g++ an_ch2_1b.cpp -o an_ch2_1b.sh

(注意这里是cpp文件,所以需要用g++来编译,用gcc会报错),指令的意思是把an_ch2_1b.cpp文件编译为an_ch2_1b.sh可执行脚本文件,也可以编译为an_ch2_1b文件,去掉文件后缀。

然后输入ls命令,可以看到已经成功编译了源代码。

img

执行可执行文件,输入指令./an_ch2_1b.sh

img

an_ch2_1b.cpp文件创建好之后按照同样的步骤来创建an_ch2_1a.cpp文件。

an_ch2_1a.cpp的源代码如下:

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <cstdio>
#include <stdlib.h>
using namespace std;
int main()
{
    pid_t pid;
    pid = fork();
    if (pid == -1) cout << "fail to create" << endl;
    else if (pid == 0) system( "./an_ch2_1b.sh" );
    return 0;
}

同样,编译后执行脚本文件,效果如下图

img

程序会一直输出Those output come from child,[系统时间],用CTRL + C也没法关掉,因为这只能停止一个进程。所以需要用CTRL + D来停止整个终端。

线程实例 #

1.实例描述

编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。

主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1。

2.具体步骤

步骤和上面类似,只不过是用C语言来编写这个程序。创建Consoleapp.c 文件,写入代码如下:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int shared_var = 0;
void * thread( void * arg )
{
    while (1)
    {
        printf( "in the thread shared_var:%d\n" , --shared_var);
    }
}
int main()
{
    pthread_t pt;
    int ret = pthread_create(&pt, NULL, ( void *)thread, NULL);
    if (ret != 0) printf( "fail to create thread\n" );
    while (1)
    {
        printf( "in the main shared_var:%d\n" , ++shared_var);
    }
    pthread_join(pt, NULL);
    return 0 ;
}

编译源代码,这里要用gcc来编译,不能用g++,另外由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:

 gcc Consoleapp.c -lpthread  -o Consoleapp.sh

执行脚本,观察效果:

img

可以看到整个程序运行过程中公共变量的值始终在增大,并且数字是连续的,说明另外一个现成并没有抢到过CPU资源,这是因为时间太短了,加上CPU的运算速度很快,所以看不到另一个线程作用的效果。等待程序运行一段时间之后观察输出情况就能看出并发了,如下图:

img

同时也可以在原来的主线程打印之后的代码中加入一行代码

pthread_yield(NULL)

可以让线程主动释放CPU来运行另一个线程,这样就可以观察到数字递减的情况,如下图:

img

参考 #

  1. ^ https://blog.csdn.net/analogous_love/article/details/97823301

Last modified on 2021-04-22