目录
编写一个或相关几个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() 创建了一个子进程。在子进程中,我们向管道中写入了一条消息。在父进程中,我们从管道中读取了这条消息,并输出了它。
需要注意的是,在使用管道进行进程通信时,需要在父子进程中分别关闭管道的读端和写端,以免造成死锁等问题。
- 实验总结
包括:对本阶段所学及实践的总结;实验中遇到的问题及解决方法;进行客观的个人评定并给自己评分。
<实验报告要求>
认真撰写实验报告,实验内容与实验结果真实并具备实用性。