综合实验四 Linux的编译环境及线程编程

该实验涉及Linux中C/C++和Java程序的编译与运行,使用gcc/g++和javac命令。实验内容包括线程库的使用,如pthread_create和pthread_join等,以及进程的创建和后台运行。此外,还涵盖了子进程的创建和父子进程间的通信。
摘要由CSDN通过智能技术生成

目录

一、实验目的:

二、实验要求:

三、实验环境

四、实验内容:

编写一个或相关几个C/C++代码文件,并使用gcc/g++实现编译;运行相应的可执行程序。

编写一个或相关几个Java代码文件,并使用javac实现编译,使用java运行相应的可执行程序。

列出用户线程库信息,以及主要的线程管理函数。

设计一个程序实例(可列出全部代码或程序功能与主要函数),编写用户线程,并实现运行。

创建一个进程,并使之成为后台进程。

创建一个子进程,并实现与父进程的通信。


一、实验目的:

    要求熟悉Linux环境中的程序编译、调试与项目管理过程并能实现具体操作;熟练使用基础函数库中与线程库中的管理函数,实现用户线程编程过程,并深入了解Linux的线程管理机制。

、实验要求:

通过这个第四阶段实验,要求掌握以下操作与相关知识:

(一)Linux中C/C++程序的编译运行环境及操作;

(二)Linux中Java程序的编译运行环境及操作;

(三)了解和熟悉C/C++函数库

(四)掌握Linux线程管理机制与线程编程过程。使用用户线程库的管理函数实现用户级线程编程。

(五)掌握进程创建过程并熟悉进程间通信的实现。

三、实验环境

硬件环境:戴尔 G5 5500

软件环境:VMware 15 pro ,CentOS7虚拟机

、实验内容:

1.编写一个或相关几个C/C++代码文件,并使用gcc/g++实现编译运行相应的可执行程序。

(1)打开centos虚拟机,由于centos没有安装c或c++ 编译环境,所以需要下载编译环境

yum -y install gcc gcc-c++ autoconf make

详细教程看链接:

https://blog.csdn.net/jq_98/article/details/124902864

https://blog.csdn.net/sinat_39037205/article/details/121869349

(2)c++代码实例:

#include<iostream>
using namespace std;

int main()
{
        int i,j,k;
        for (i = 1; i < 10; i++)
        {
                for (j = 1; j <= i; j++)
                {
                        k = i * j;
                        cout << j << "×" << i << "=" << k << " ";
                }
                cout << endl;
        }
        return 0;
}

2.编写一个或相关几个Java代码文件,并使用javac实现编译,使用java运行相应的可执行程序。

(1)如果已安装配置好java,可以复制下面代码:

public class Demo01 {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
~  

在centos系统中新建一个test.java文件,在命令行输入如下代码,生成test.class文件,并运行java程序

javac test.java
java test

 (2)如果没有安装java环境:

下载java8JDK软件包:

yum install -y java-1.8.0-openjdk*

 查看是否安装成功:

java --version

配置java环境:

#进入etc
cd /etc

#查看文件
ls

#编辑文件profile,如果vim无法使用用vi也行
vim profile

#在profile文件,添加如下变量:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

#按下ESC,然后:wq,退出并保存

#执行以下命令使配置文件生效:
source /etc/profile

查看JDK变量:
echo $JAVA_HOME

echo $PATH

echo $CLASSPATH


 然后,按照1里操作就行。

3.列出用户线程库信息,以及主要的线程管理函数。

[root@localhost etc]# ps -u root -l

您可以使用以下命令来列出在CentOS 7上正在运行的用户线程及其所使用的库:
ps -u <username> -L
其中,<username> 是您想要列出线程信息的用户的用户名。此命令将输出所有属于该用户的线程及其所使用的库的信息。
另外,如果您只想列出某个特定进程的信息,可以使用以下命令:
pmap -x <pid>
其中,<pid> 是您想要列出的进程的 PID(进程ID)。此命令将输出该进程所使用的所有库的信息。
以下是一些常用的线程管理函数:
pthread_create
:创建一个新线程。
pthread_join
:等待一个线程的结束。
pthread_detach
:将线程标记为“分离状态”,以便在结束时自动释放线程的资源。
pthread_exit
:终止一个线程并返回一个值。
pthread_cancel
:请求取消一个线程。
pthread_attr_init
:初始化线程属性。
pthread_attr_destroy
:销毁线程属性。
pthread_attr_setdetachstate
:设置线程的分离状态。

4.设计一个程序实例(可列出全部代码或程序功能与主要函数),编写用户线程,并实现运行。

 在命令行输入vi test.py创建一个python文件并输入如下代码: 

# -*- coding: UTF-8 -*-
import threading
# 定义一个函数作为线程的执行体
def task():
    print("This is a user thread.")
# 创建一个用户线程
user_thread = threading.Thread(target=task)
# 启动用户线程
user_thread.start()
# 等待用户线程执行完毕
user_thread.join()
print("User thread has finished.")

python test.py运行程序 

5.创建一个进程,并使之成为后台进程。

nohup命令可以把程序或脚本移到后台运行

要在 CentOS 7 中创建一个后台进程,您可以使用以下命令:
nohup your_command_here &

命令解释
nohup命令可确保即使当前终端会话被关闭,进程也会继续运行
&符号用于将进程放入后台运行。
your_command_here您要运行的实际命令

https://www.runoob.com/linux/linux-comm-nohup.html

nohup python test.py &

后台运行之前的python文件 

6.创建一个子进程,并实现与父进程的通信。

以下是我在chatgpt找到的答案:

在 Unix/Linux 系统中,创建子进程有多种方式,其中常用的是使用 fork() 系统调用。创建子进程后,父子进程之间可以通过管道(pipe)、消息队列(message queue)、共享内存(shared memory)等方式进行通信。
下面是一个使用 fork() 创建子进程并通过管道进行通信的示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define BUFFER_SIZE 25
#define READ_END 0
#define WRITE_END 1
int main(void) {
    char write_msg[BUFFER_SIZE] = "Hello, Parent!";
    char read_msg[BUFFER_SIZE];
    int fd[2];
    pid_t pid;
    // 创建管道
    if (pipe(fd) == -1) {
        fprintf(stderr, "Pipe failed");
        return 1;
    }
    // 创建子进程
    pid = fork();
    if (pid < 0) {
        fprintf(stderr, "Fork failed");
        return 1;
    } else if (pid == 0) {  // 子进程
        // 关闭管道读端
        close(fd[READ_END]);
        // 写入数据到管道
        write(fd[WRITE_END], write_msg, strlen(write_msg) + 1);
        // 关闭管道写端
        close(fd[WRITE_END]);
    } else {  // 父进程
        // 关闭管道写端
        close(fd[WRITE_END]);
        // 从管道读取数据
        read(fd[READ_END], read_msg, BUFFER_SIZE);
        printf("Received message: %s\n", read_msg);
        // 关闭管道读端
        close(fd[READ_END]);
    }
    return 0;
}

在上面的示例代码中,我们使用 pipe() 创建了一个管道,并使用 fork() 创建了一个子进程。在子进程中,我们向管道中写入了一条消息。在父进程中,我们从管道中读取了这条消息,并输出了它。
需要注意的是,在使用管道进行进程通信时,需要在父子进程中分别关闭管道的读端和写端,以免造成死锁等问题。 

  • 实验总结

包括:对本阶段所学及实践的总结;实验中遇到的问题及解决方法;进行客观的个人评定并给自己评分。

<实验报告要求>

认真撰写实验报告,实验内容与实验结果真实并具备实用性。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值