Linux进程线程编程练习题(附答案)

目录

实验1

实验2 


学完了Linux进程线程,快来看看你会不会做这些题目吧!相信你独立做完这些题后会有很大的进步!每一题后面都有我做的答案,如果你有更好的也欢迎你在评论区讨论哦!!

实验1

        假设有一个数组A长度为N,其中每个元素都是一个整数。请编写一个程序,创建M个线程,每个线程计算数组A的一个子数组的和,并把结果累加到一个全局变量S中。当所有线程结束后,主线程输出S的值。

附上pthread构造形式

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

------------------------------------------------------做题分割线-----------------------------------------------------------

答案:

/*题目:假设有一个数组A,长度为N,其中每个元素都是一个整数。
 * 请编写一个程序,创建M个线程,
 * 每个线程计算数组A的一个子数组的和,并把结果累加到一个全局变量S中。
 * 当所有线程结束后,主线程输出S的值。*/

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>

#define MaxSize 1000
#define M 10

int arr[MaxSize]; //定义数组大小,大小为1000
int s = 0; // 数组总和
pthread_mutex_t mutex; // 互斥锁

void *thread_func(void *arg) {
	int id = *(int *)arg;// 注意参数传递
	int start = id * (MaxSize / M);
	int end = (id == M - 1) ? MaxSize : (id + 1) * (MaxSize / M); // 确定最后一个数
	int sum = 0;
	for(int i = start; i < end; i++) {
		sum += arr[i];
	}
	pthread_mutex_lock(&mutex);
	s+=sum;
	pthread_mutex_unlock(&mutex);
}

int main() {
	// 初始化数组,大小分别是1,2,...,1000
	for(int i = 0; i < MaxSize; i++) {
		arr[i] = i + 1;
	}
	
	// 创建10个线程
	pthread_t thread[M];
	int pid[M];// 线程id
	for(int i = 0; i < M; i++) {
		pid[i] = i;
		if(pthread_create(&thread[i], NULL, thread_func, &pid[i]) != 0) {
			perror("pthread_create");
			exit(1);
		}
	}

	// 等待所有线程结束
	for(int i = 0; i < M; i++) {
		if(pthread_join(thread[i], NULL) != 0) {
			perror("pthread_join");
			exit(0);
		}
	}

	// 最后输出结果
	printf("The sum of array is %d\n", s);

	return 0;

}


实验2

        编写一个程序,创建一个子进程,并在子进程中执行一个命令,然后在父进程中等待子进程结束,并输出子进程的退出状态。

附上execl的构造形式

int execl(const char *pathname, const char*arg0, ...);

------------------------------------------------------做题分割线-----------------------------------------------------------

答案:

/*题目:编写一个程序,创建一个子进程,并在子进程中执行一个命令,然后在父进程中等待子进程结束,并输出子进程的退出状态。*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
	pid_t pid = fork(); // 创建子进程
	if(pid == 0) { // 子进程
		execl("/bin/ls", "ls", "-l", NULL); //执行ls -l 命令
		perror("execl"); // 若execl函数返回,说明execl发生了错误
		exit(1);
	} else if(pid > 0) { // 父进程
		int status; // 等待的状态
		wait(&status); // 等待子进程结束
		if(WIFEXITED(status)) { // 如果子进程正常终止
			printf("Child process exited with status %d\n", WEXITSTATUS(status));
		} else {
			printf("Child process exited abnormally\n");
		}
	} else { // 如果fork失败
		perror("fork");
		exit(1);
	}
	return 0;
}

小结

通过这两个实验,学到了什么?快来总结一下吧!

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
一、 实验目的 1、 通过实验了解和熟悉Linux文件系统 2、 掌握文件操作命令 3、 了解文件与目录的默认权限,掌握文件权限的设置 4、 掌握文件的链接 二、 开发工具和运行环境 1、虚拟机VMware 2、Linux操作系统 三、 实验内容 1、了解和熟悉Linux文件系统 了解Linux文件系统、文件命名、文件类型和常见目录:根目录(/)、 .bin、boot、dev、etc、home、Lib、lost+found、 opt、root、 usr、mnt、proc、sbin、 tmp、 var. 2、文件操作命令: (文件和目录名自拟、自行设计实验步骤) (1) 1s: 显示目录内容 -a显示指定目录下所有的目录与文件 -1以 长格式显示文件的详细信息。 -d显示目录本身信息 i显示索引号 (2) cd:改变当前工作目录 格式: cd [目录名] cd .. 上移- -层目录(注意,需要有空格) cd 移到自己的主目录 (3) cat: 查看文件信息命令 显示文件信息:格式: cat [选项]文件名 -n输出编号 建立文件: cat>新文件名ctrl+d 合并文件: cat 文件1文件2>新文件 (4) more: 逐屏显示文件内容 格式: more 文件名 (5) cp:复制命令 格式: cp [选项] 源文件或目录目标文件或目录 同时可以复制多个文件 -f 出现覆盖情况不提示 -p复制后,保持原有属性。目标文件保持原有的生成日期和inode编号 -r 复制目录及目录下的文件 普通用户并不能进行这样的操作,只能切换到root用户然后进行-r的递归复制。 (6) rm: 删除文件与目录 格式: mv [选项] 文件名或目录名 -f删除时不提示 -r 删除目录及目录下的文件(常用: -rf ) (7) mv: 文件移动及改名命令 格式: mv [选项]源文件或目录 目 标文件或目录 -f覆盖文件时 不提示 (8) grep: 文件信息检索命令 格式: grep [选项]字符串 [文件 ... ] -i 不区分大小写 (9) sort: 排序命令 格式: sort [选项][文件列表] (10) mkdir 创建目录命令 格式: mkdir [选项] [目录名] 可以同时创建多个目录 p :递归创建目录 -m:创建目录的时候赋予权限 (11) rmdir删除“空”目录命令 格式: rmdir [选项] [目录名] 注意:目录为空才能删除;否则需采用rm - r来删除。 p :递归删除目录,删除子目录,其父目录为空时,也同时删除3、文件权限的设置: (文件和目录名自拟、自行设计实验步骤) 文件的属主与属组 (1) chown [选项] [所有者][:[组]] 文件列表 更改每个文件的所有者和/或所属组。 字母模式形式即“用户对象操作符号操作权限”,其命令格式为:(2) chmod [选项]模式[,模式]文件名 +:添加-:取消=:赋予并取消其他所有 数字形式即由三位八进制数字组成,其命令格式为: chmod八进制模式 文件名 文件的特殊权限: SUID、 SGID 和Sticky 4、文件的链接: (文件和目录名自拟、自行设计实验步骤) (1)硬链接:不带选项,ln命令创建硬链接。在另外的目录或本目录中增加目标文件的一个目录项,一个文件就登记在多个目录中 1n源文件目标文件 (2)软链接(符号链接):用“1n -s”命令建立符号链接时,最好源文件用绝对路径名,这样可以在任何工作目录下进行符号链接。类似于Windows系统中的快捷方式。 In -s源文件目标文件
### 回答1: 《UNIX/Linux编程实践教程》是一本非常实用的编程教材,对于学习和掌握UNIX/Linux编程的人来说,是一本不可或缺的参考书。 本书主要介绍了UNIX和Linux系统下的编程基础知识、常用库函数以及实际应用技巧。首先,书中详细阐述了UNIX和Linux的基本概念、文件系统、进程管理、输入输出等基础知识,为读者打下坚实的理论基础。然后,通过大量实例和案例,详细介绍了C语言在UNIX和Linux环境下的编程技巧和常用函数的使用方法,例如文件操作、进程管理、网络编程等。同时,还介绍了常用的开发工具和调试技巧,使读者能够更加高效地进行编程实践。 《UNIX/Linux编程实践教程》使用简明易懂的语言,结合大量案例和实例进行讲解,使读者能够更好地理解和掌握所学知识。此外,书中还配有丰富的习和实践项目,帮助读者巩固所学内容,并实际应用所学知识进行项目开发。 通过学习《UNIX/Linux编程实践教程》,读者能够系统地学习UNIX和Linux系统下的编程知识,掌握基本的开发技巧和调试方法,并能够灵活应用于实际项目开发中。无论是初学者还是有一定编程基础的人,都可以通过这本教程提升自己的编程水平,并在UNIX和Linux环境下进行高效的开发工作。 总之,《UNIX/Linux编程实践教程》具有理论与实践相结合、内容丰富全面的特点,是一本实用性很强的编程教材,值得每个想要学习UNIX和Linux编程的人去阅读和学习。 ### 回答2: UNIX/Linux编程实践教程是一本非常经典且实用的电子书,该书的pdf版本提供了更方便的阅读和学习方式。本书包含了丰富的实例和案例,旨在帮助读者理解UNIX/Linux系统的编程原理和实践技巧。 该书的内容主要包括以下方面:首先介绍了UNIX/Linux系统的基础知识,包括文件系统、进程管理、网络编程等。接着深入讲解了Shell编程和系统调用的使用方法和技巧,帮助读者快速掌握UNIX/Linux系统的编程技术。 此外,该书还介绍了常用的开发工具和环境,如GCC编译器、Make工具等,以及如何使用它们进行程序的编译和调试。同时,还讲解了常见的UNIX/Linux应用开发技术,如网络编程、多线程编程等,使读者能够更好地开发和优化自己的应用程序。 这本书的特点是实用性强,结合了丰富的实例和案例,让读者能够更好地理解和掌握UNIX/Linux编程技术。此外,该书还提供了逐步指导和实践练习,帮助读者逐步提升自己的编程能力。 总的来说,UNIX/Linux编程实践教程是一本非常优秀的电子书,适合想要学习和深入了解UNIX/Linux系统的开发人员和爱好者。无论是初学者还是有一定经验的开发人员,都可以从中受益匪浅。如果你正在学习UNIX/Linux编程,我强烈推荐你阅读这本书的pdf版本。 ### 回答3: 《UNIX/Linux编程实践教程》是一本经典的计算机编程教程,对于学习UNIX/Linux操作系统编程的人来说是一本非常有价值的参考书。这本书主要介绍了UNIX/Linux环境下的开发工具和编程技术,包括Shell脚本编程C语言编程、系统编程等内容。 《UNIX/Linux编程实践教程》的特点之一是它的全面性和实用性。书中详细讲解了UNIX/Linux环境下各种常用的开发工具和命令,如gcc、make、grep、sed等,以及如何使用它们进行编程和调试。此外,书中还介绍了常用的编程技巧和方法,如文件操作、进程管理、内存管理等,让读者能够更好地理解和掌握UNIX/Linux系统编程的要点。 这本书的另一个亮点是它的实践性。《UNIX/Linux编程实践教程》中包含了大量实例和案例,通过这些实例,读者可以直接动手实践并应用所学的知识。这种实践性的教学方法可以帮助读者更好地理解和记忆所学的内容,并增强对UNIX/Linux编程的实际应用能力。 总的来说,《UNIX/Linux编程实践教程》是一本非常实用的编程教程,它以通俗易懂的语言讲解了UNIX/Linux系统编程的基本原理和实践技巧,具有很高的实用性和可操作性。对于想要学习UNIX/Linux系统编程的人来说,这本书是一个非常好的选择,可以帮助他们快速入门并提高编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值