Linux进程控制编程实验

多线程编程:保证T1、T2、T3三个线程顺序执行 多线程编程:保证T1、T2、T3三个线程顺序执行 package com.company.niuke.Thread; class ThreadJoin extends Thread{ public ThreadJoin(String name){ super(name); } @Override public void run(){ for(int i=0;i<1000;i++){ System.out.pri 阅读详情

任务1:编写一个进程创建实验程序task51.c,创建如图所示的进程族亲结构,其中p1是程序启动时由加载程序创建第一个进程。各进程的输出信息分别如下:
p1:I am father process p11: 当前时间是< 年 月 日 时 分 秒> p12: I am young
brother process p121:我的学号是<您的学号xxx> p122:我的姓名是<您的姓名xxx>
提示:获得当前系统时间的函数是 time_t time(time_t *t);
将time_t类型的的时间转换成时间字符串的函数是:char *ctime(const time_t *timep);
其使用方法见教材3.2.4 思考:如何验证产生的进程符合如图的族亲关系?

在这里插入图片描述
思考题:使用getpid()和getppid()函数结合使用就可以验证设计的族亲结构是否准确,其中getpid是得到自己的pid,getppid是得到父进程的pid。

任务2:参考教材shellex.c代码,实现一个简单的交互式shell程序task52.c,具备的功能至少有:
(1)打印提示符%;获取用户输入指令;解析指令;寻找命令文件,执行指令 (1)显示命令提示符%;
(2)获取用户输入指令;解析指令;寻找命令文件,执行指令; (3)前一个命令完成后才继续显示命令提示符%,等待用户输入下一条命令;
(3)如果输入“exit”或“log out”,则退出shell. (4)允许命令参数间有多个空格,也允许命令前后有空格
(5)支持输出重定向和管道功能。 提示:可参考上一次实验分解命令行的代码

任务3:写一个信号机制实验程序task53.c,由父进程创建两个子进程,通过终端输入Crtl+\组合键向父进程发送SIGQUIT软中断信号或由系统时钟产生SIGALRM软中断信号发送给父进程;父进程接收到这两个软中断的其中某一个后,向其两个子进程分别发送整数值为SIGUSR1
(10)和SIGUSR1 (12)软中断信号,子进程获得对应软中断信号后,分别输出“<进程PID> killed by
<信号编号>”后,终止运行;父进程调用wait()函数等待两个子进程终止,然后自我终止。

任务4(可选):写一个子进程管理程序task54.c,借鉴图5-34的procmask2.c方法管理子进程,父进程循环读取用户输入的操作命令,创建子进程、显示相关信息和终止子进程等。具体用户命令为:

  1. 命令1:功能是创建一批子进程,格式为“create <进程数>” ,命令执行成功后,显示所有新创建子进程PID。比如“create
    10”表示创建10个子进程,子进程执行的代码可以为:“while(1){};exit(100);”
    2)命令2:终止一批子进程,格式为“kill …”(如“kill 123 456
    789”为终止PID号为123、456、789的三个子进程),子进程显示“killed by
    parent”后终止,父进程通过SIGCHLD信号处理程序等待子进程终止,显示终止的子进程PID。
    3)命令3:显示当前子进程列表,命令格式为:“ps -u”
    4)命令4:父进程终止命令,格式为“exit”,当所有子进程都结束后,才允许执行该命令。

提示:可用fgets函数将整个命令作为一行文本输入,再调用库函数(如strtok或strchr)将各个命令参数提取出来。

任务1:

#include"wrapper.h"
#include<stdio.h>
#include<time.h>
int main() {                         //main函数就是p1进程
	pid_t  pid1, pid2,pid3;
	printf("I am father process\n");      //p1进程的输出语句
	pid1 = fork();                    //p进程创建第一个子进程p11
	if (pid1 == 0) {
		time_t timer;
		time(&timer);
		printf("p1:%s\n", ctime(&timer));
		exit(0);
	}
	else {
		pid2 = fork();                 //由p进程创建子进程p12
		if (pid2 == 0) {
			printf("p12: I am young brother process\n");
			pid3 = fork();
			if (pid3 == 0) {            //由p12进程创建子进程p121
				printf("p121:我的学号:201841413302\n");
				exit(0);
			}
			pid3 = fork();
			if (pid3 == 0) {            //由p12进程创建子进程p122
				printf("p122:我的姓名:陈霖\n");
				exit(0);
			}
			exit(0);
		}
		exit(0);
	}

}

思考题:使用getpid()和getppid()函数结合使用就可以验证设计的族亲结构是否准确, 其中getpid是得到自己的pid,getppid是得到父进程的pid。

任务2:

#include"wrapper.h"
#include<stdio.h>
void execute(char* cmdline);
int builtin_command(char** argv) ;
int parseline(char* buf, char** argv);
void MYdup1();
void MYdup2();
int main() {
	char cmdline[MAXLINE]; /* 命令行缓冲区 */
	while (1) {
		printf("%%");
		fgets(cmdline, MAXLINE, stdin);/* 读取命令行 */
		if (feof(stdin))
			exit(0);
		execute(cmdline);/* 执行命令 */
	}
}
void MYdup1(){	//重定向到一个data.txt文件路径下面
	int fd;
	fd = open("data.txt",O_CREAT|O_WRONLY|O_APPEND,0777);
   dup(1);//先把标准输出备份好,等待未来重定向恢复
	close(1);
	dup(fd);
}
void MYdup2(){	//路径恢复,标准输出
	close(1);
	dup2(4,1);
}
void execute(char* cmdline) {
	char* argv[MAXLINE]; /*execve()参数表 */
	char buf[MAXLINE]; /* 保存修改后的命令行 */ 
	int bg; /* 是否在后台执行 */ 
	pid_t pid; /* 子进程PID*/ 
	strcpy(buf, cmdline); 
	bg = parseline(buf, argv);/* 解析命令行 */ 
	if (argv[0] == NULL) return; /* 如果第1个参数为空,则忽略命令 */
	if (!builtin_command(argv)) {
		if ((pid = fork()) == 0) { /* 创建子进程 */ 
			if (execvp(argv[0], argv) < 0) { 
				printf("%s:Command not found.\n", argv[0]); exit(0); 
			} 
		}
		if (!bg) { /* 前台执行 */ 
			int status;

			if (waitpid(pid, &status, 0) < 0) 
				perror("waitpid error");
		}
		else 
			printf("%d%s", pid, cmdline);
	} return;
}
/* 判断和执行内置命令 */ 
int builtin_command(char** argv) {
	if (!strcmp(argv[0], "exit")) /* 内置命令exit */
		exit(0);
	if(!strcmp(argv[0],"log out"))/* 内置命令logout */
		exit(0);
	if(!strcmp(argv[0],"MYdup1")){/* 重定向 */
		MYdup1();
       return 1;
	}
	if(!strcmp(argv[0],"MYdup2")){/* 路径恢复 */
		MYdup2();
       return 1;
	}
	if (!strcmp(argv[0], "&")) /* 忽略由&开始的命令串 */
		return 1;
	return 0; /* 非内置命令 */
}
int parseline(char* buf, char** argv) {
	char* delim; /* 指向第1个分隔符 */
	int argc; /* 字符串数组args中命令行参数个数 */
	int bg; /* 后台作业 */
	buf[strlen(buf) - 1] = ' '; /* 用空格替换行末换行符 */
	while (*buf && (*buf == ' '))/* 删除行首空格 */
		buf++;
	/* 创建 argv数组 */
	argc = 0;
	while ((delim = strchr(buf, ' ')))
	{
		argv[argc++] = buf;
		*delim = '\0';
		buf = delim + 1;
		while (*buf && (*buf == ' ')) /* 忽略空格,查找下一个参数起始位置 */
			buf++;
	}
	argv[argc] = NULL;
	if (argc == 0) /* 忽略空行*/
		return 1;
	/* 命令是否应在后台执行 */
	if ((bg = (*argv[argc - 1] == '&')) != 0)
		argv[--argc] = NULL;
	return bg;
}

任务3

#include <stdio.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <unistd.h>  
#define sec 5  
void waiting();
void stop();
int wait_mark;
int main() {
	int p1, p2;  /*定义两个进程号变量*/
	while ((p1 = fork()) == -1);  /*循环创建进程至成功为止*/
	if (p1 > 0) {
		while ((p2 = fork()) == -1);  /*循环创建进程至成功为止*/
		if (p2 > 0) {
			wait_mark = 1;
			alarm(sec);/*5秒后执行*/
			signal(SIGQUIT, stop);
			signal(SIGALRM, stop);/*父进程接受两种信号,均用stop去响应*/
			waiting();
			kill(p1, 10);/*向p1发送软中断信号10*/
			kill(p2, 12);/*向p2发送软中断信号12*/
			wait(0);
			wait(0);/*等待两个子进程终止后才进行下一条代码*/
			printf("parent process is killed!\n");
			exit(0);/*自我终止*/
		}
		else {
			signal(SIGQUIT, SIG_IGN);/*忽略信号*/
			signal(SIGALRM, SIG_IGN);/*忽略信号*/
			wait_mark = 1;
			signal(12, stop); /*接收到软中断信号12,转stop*/
			waiting();/*在wait置0前,不可往下执行*/
			lockf(1, 1, 0);  /*加锁*/
			printf("进程%d is killed by 信号12!\n", getpid());
			lockf(1, 0, 0); /*解锁*/
			exit(0); /*子进程2退出*/
		}
	}
	else {
		signal(SIGQUIT, SIG_IGN);/*忽略信号*/
		signal(SIGALRM, SIG_IGN);/*忽略信号*/
		wait_mark = 1; /*将等待标记置1直到中断信号刺激stop*/
		signal(10, stop);/*接收到软中断信号10,转stop*/
		waiting();  /*在wait置0前,不可往下执行*/
		lockf(1, 1, 0);
		printf("进程%d  is killed by 信号10!\n", getpid());/*接收到父进程发送信号后,父进程杀死子进程1*/
		lockf(1, 0, 0);/*解锁*/
		exit(0); /*子进程1退出*/
	}
	return 0;
}
void waiting() {
	while (wait_mark != 0);
}
void stop() {
	wait_mark = 0;
}

任务4:

#include"wrapper.h"
#include<stdio.h>
#include<string.h>
void execute(char* cmdline);/*执行命令*/
int builtin_command(char** argv);/*检查是否为用户内置命令*/
int parseline(char* buf, char** argv);/*将命令切割成标准格式的若个部分*/
void create(int num);		/*创建子进程num个*/
void Exit();
void stop();
void waitBack();
void MyKill(char** argv);
int n;
int mask;
static int count = 0;/*父进程下面的子进程数量,若为0才能调用Exit()函数*/

int main() {
	char cmdline[MAXLINE]; /* 命令行缓冲区 */
	signal(SIGCHLD, waitBack);

	while (1) {
		printf("%%");
		fgets(cmdline, MAXLINE, stdin);/* 读取命令行 */
		if (feof(stdin))
			exit(0);

		execute(cmdline);/* 执行命令 */
		//usleep(100);/*每次执行完任务,就停止100微秒*/
	}
}

void execute(char* cmdline) {
	char* argv[MAXLINE]; /*execve()参数表 */
	char buf[MAXLINE]; /* 保存修改后的命令行 */
	pid_t pid; /* 子进程PID*/
	strcpy(buf, cmdline);
	parseline(buf, argv);/* 解析命令行 */
	if (argv[0] == NULL) 
		return; /* 如果第1个参数为空,则忽略命令 */
	if (!builtin_command(argv)) {
		if ((pid = fork()) == 0) { /* 创建一个临时进程,因为调用execvp后的进程就不会回来了 */
			count++;
			if (execvp(argv[0], argv) < 0) {
				printf("%s:Command not found.\n", argv[0]);
				exit(0);/*立即放弃该临时进程*/
			}
		}
		else{
			usleep(200);
			waitpid(pid,NULL,0);
		}
	} 
}
/* 判断和执行内置命令 */
int builtin_command(char** argv) {
	if (!strcmp(argv[0], "exit")) { /* 内置命令exit */
		Exit();
		return 1;
	}

	if (!strcmp(argv[0], "create")) { /* 内置命令create */
		create(atoi(argv[1]));
		return 1;
	}
	if (!strcmp(argv[0], "kill")) { /* 内置命令kill */
		MyKill(argv);
		return 1;
	}
	if (!strcmp(argv[0], "&")) /* 忽略由&开始的命令串 */
		return 1;

	return 0; /* 非内置命令 */
}

int parseline(char* buf, char** argv) {
	char* delim; /* 指向第1个分隔符 */
	int argc; /* 字符串数组args中命令行参数个数 */
	int bg; /* 后台作业 */
	buf[strlen(buf) - 1] = ' '; /* 用空格替换行末换行符 */
	while (*buf && (*buf == ' '))/* 删除行首空格 */
		buf++;
	/* 创建 argv数组 */
	argc = 0;
	while ((delim = strchr(buf, ' ')))
	{
		argv[argc++] = buf;
		*delim = '\0';
		buf = delim + 1;
		while (*buf && (*buf == ' ')) /* 忽略空格,查找下一个参数起始位置 */
			buf++;
	}
	argv[argc] = NULL;
	n = argc;/*记录命令中出现的参数个数*/
	if (argc == 0) /* 忽略空行*/
		return 1;

	/* 命令是否应在后台执行 */
	if ((bg = (*argv[argc - 1] == '&')) != 0)
		argv[--argc] = NULL;
	return bg;
}
void create(int num) {/* 命令1:创建num个子进程 */
	int pid, i;
	if (num <= 0) {
		return;
	}
	if ((pid = fork()) > 0) {
		create(num - 1);
		count++;
		//printf("%d\n",count);      //测试
	}
	else {
		signal(10, stop);
		printf("新创建的子进程PID=%d\n", getpid());
		mask = 1;
		while (mask);/*持续循环,等待终止信号10*/
		printf("%d killed by parent\n",getpid());
		exit(100);
	}
}
void MyKill(char** argv) {
	int i = 1;
	while (i < n) {	/*向命令中出现的所有Pid进程发送信号10*/
		
		kill(atoi(argv[i]), 10);/* 10 用户自定义信号,我定义为终止信号*/
		i++;
	}
	//sleep(1); //测试
}
void Exit() {/* 命令4 */
	if (count <= 0)
		exit(0);
	else {
		printf("error!还有子进程没有终止\n");
	}
}
void stop() {/*子进程停止循环*/
	mask = 0;
}
void waitBack() {/*父进程回收子进程资源,并显示子进程的pid*/
	int a;
	while ((a = waitpid(-1, NULL, 0)) > 0) {
		printf("终止的子进程PID=%d\n", a);
		count--;
		//printf("%d\n",count); //测试
	}
}

总结

任务Value
任务一考察对进程的创建和族亲结构的掌握,一般 来说如果不太确定的话,可以在纸上做个草图,主要是熟悉fork()函数的使用。
任务二通过调用fgets函数来获取用户输入指令,然后参照shellex.c的思想,调用parseline函数将这行输入切割成多个字符串;即解析指令;然后寻找命令文件,执行指令。按照题目要求设置两个内置命令:“exit”或“log out”,接收到则退出shell。最后就是设置两个函数MYdup1和MYdup2,来支持输出重定向和管道功能。
任务三这个信号发送的章节掌握的不是很到位,所以费了不少功夫。主要是理解几个新函数,signal->指明当前进程遇到信号(参数1)时,该怎么处理(参数2)。Wait(0)->停止向下运行,等待子进程终止。Kill()->向pid(参数1)的进程发送信号(参数2),alram()->在(参数一)/秒后产生时钟信号,然后是自制函数,waiting()->持续执行,知道wait_mask变成0,而stop函数就是把wait_mask置0.
任务四(可选)最后写出来的程序还是有bug的,最严重的bug是有时候shell终端就会瘫痪不接受stdin的数据,导致命令shell无法向下运行,所以最后只好ctrl+\中断,但还是大部分时候还是可以运行的,苟蒻技拙,找了整整一天也没能发现问题所在,但总体的业务逻辑大体上是合乎情理的,争取有空时再弥补一下,唉,还是太懒了-- _- -,就怕没有有空的时候了。(不努力的苦果。。。)

ps:以上代码的头文件均有“wrapper.h”,这是一个万能头文件,如果需要可去本人的下载资源查找,但设置的0分下载被系统修改了,如果没有积分的同学可以私信我,但是作者很懒,说不准哪个时候上博客,只能说尽量吧。-_-!

Linux系统进程编程实验指南 在操作系统中,进程是正在执行的一个程序的实例,包括程序代码、其当前的活动以及分配到的资源集合。进程作为资源分配的基本单位,是操作系统进行调度和资源分配的核心概念。在Linux操作系统中,进程可能处于多种状态。这些状态反映了进程的运行情况和系统资源的分配情况。进程状态可以分为以下几个基本类别::该进程正在运行或在运行队列中等待。:进程正在睡眠(等待某些条件发生或接受到信号)。:进程不可中断地睡眠,通常等待I/O完成。Z (Zombie) 阅读详情

相关推荐

3操作系统实验.doc

实验一:信号机制 实验目的 1、了解什么是信号 2、熟悉LINUX系统中进程之间软中断通信的基本原理 实验内容 1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调 用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 2、分析利用软中断通信实现进程同步的机理 实验指导 一、信号 1、信号的基本概念 每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件<signal.h>中),代表同一用户的诸进程之间传 送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程在运行时,都 要通过信号机制来检查是否有信号到达。若有,便中断正在执行的程序,转向与该信号 相对应的处理程序,以

Linux进程控制编程

任务1: 要求: 编写一个进程创建实验程序task51.c,创建如图所示的进程族亲结构,其中p1是程序启动时由加载程序创建第一个进程。各进程的输出信息分别如下: p1:I am father process p11: 当前时间是< 年 月 日 时 分 秒> p12: I am young brother process p121:我的学号是<您的学号xxx> p122:我的姓名是<您的姓名xxx> ...

ywd171的博客 1952

Android手机免root玩转Kali NetHunter:Termux保姆级安装指南(附Kex VNC配置)

本文提供了一份详细的Android手机免root安装Kali NetHunter的保姆级指南。通过使用Termux终端模拟器,用户无需解锁Bootloader或获取root权限,即可在普通安卓设备上部署完整的Kali Linux渗透测试环境。教程涵盖了从环境准备、NetHunter核心安装到配置Kex VNC实现图形桌面访问的全过程,并附带了电脑投屏与常见问题解决方案,旨在打造一个便携的移动安全学习与测试平台。

weixin_29208327的博客 294

Linux进程控制编程实验_02

任务1:编写一个进程创建实验程序task51.c,创建如图所示的进程族亲结构,其中p1是程序启动时由加载程序创建第一个进程。各进程的输出信息分别如下: p1:I am father process p11: 当前时间是< 年 月 日 时 分 秒> p12: I am young brother process p121:我的学号是<您的学号xxx> p122:我的姓名是&l...

myszpl的博客 4447

英飞凌 AURIX Development Studio工程移植到Hightec的方法

1. 软件简介 AURIX™ Development Studio是英飞凌针对AURIX TC2XX/TC3XX系列单片机推出了一款免费的软件,集成了iLLD库,内置Tasking compiler和Tasking Debugger,但这两个模块只能用于非商业用途,可供学习和试用。iLLD库是英飞凌为TC2XX和TC3XX Tricore系列单片机提供的底层驱动库,有完善的使用手册,和较好的移植性。 Hightec是一款可以用来开发Aurix系列单片机的编译器,有免费版,可商用,集成GCC编译器,可用UDE

weixin_42967006的博客 7134

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3756

LINUX--创建进程+进程显示时间

1.编写实验程序task1.c创建进程,创建如图所示的进程族亲结构,其中p1是程序启动时由加载程序创建第一个进程。各进程的输出信息分别如下: p1:I am father process p11: 当前时间是< 年 月 日 时 分 秒> p12: I am young brother process p121:我的学号是<您的学号xxx> p122:我的姓名是<您的姓名xxx> 参考笔记 linux进程管理 fork创建进程 总代码: #include <stdio

Half-up的博客 2010

基于STM32F103C8T6的智能蓝牙手环系统设计与实现

摘要:本文设计并实现了一款基于STM32F103C8T6单片机的智能蓝牙手环系统。该系统集成了ADXL345加速度计、DS18B20温度传感器、plusesennor心率模块和BT06蓝牙模块,实现了心率(±2bpm)、体温(±0.5℃)、步数(±3%)等健康数据的实时监测与显示。通过OLED屏提供人机交互界面,支持蓝牙APP远程控制,具备自动步数清零、异常提醒等功能。测试表明系统各项功能均达到设计要求,响应时间0.1-0.5秒,心率检测准确率98%,体温检测准确率99%,功耗50mA(工作)/10mA(待

3254968421的博客 205

Linux 下文件IO编程&进程控制实验

Linux 下文件IO编程&进程控制实验 一、基本I/O操作 (1).Linux的输入/输出(I/O)操作,通常为五个方面:打开,读取,写入,定位和关闭;对应的函数分别为:open()、read()、write()、lseek()、close()。他们的原型分别如下: #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int open(cons

qq_52393849的博客 1894

YOLOv8 置信度阈值 (conf) 和 IoU 阈值 (iou) 详解:如何平衡漏检与误检?

摘要 本文深入探讨了YOLOv8目标检测模型中两个关键参数——置信度阈值(conf)和IoU阈值(iou)的核心作用。文章从目标检测的基础概念出发,解释了置信度分数反映模型预测可靠性,IoU衡量预测框重叠程度。重点剖析了非极大值抑制(NMS)机制如何通过这两个阈值进行预测框筛选:置信度阈值作为初筛门槛,IoU阈值决定重叠框的取舍。通过生动比喻和可视化图表,阐述了合理调节这两个参数能有效平衡误检与漏检问题,是优化YOLOv8模型实际表现的重要技巧。全文以实践为导向,帮助开发者掌握成为"调参大师&qu

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 1237

化工设计软件:PDMS二次开发_(7).数据导入与导出技术

在某些复杂场景下,PDMS提供的标准API接口可能无法满足需求。此时,可以通过自定义API接口来实现特定的数据导入与导出功能。自定义设备导入API接口可以处理更复杂的设备数据格式。# 导入必要的库import pdms_api # 假设有一个PDMS API库# 定义自定义设备数据# 自定义设备导入API接口# 调用自定义设备导入API接口# 输出导入成功的消息print("自定义设备数据导入成功")在PDMS二次开发中,数据的导入与导出是关键的技术环节。

kkchenjj的博客 1484

Linux进程控制编程--实验5

一、实验目的: 练习使用Linux系统调用函数创建进程、加载程序、终止进程、撤销进程,利用信号机制定制突发事件处理的编程,编写用信号机制对动态产生的进程实施管理,掌握多进程并发编程的基本方法。 二、实验内容: 先创建用户家目录下创建文件名为“姓名+学号+05”的子目录,作为本次实验目录,本次实验的所有代码都放到该目录下。要求将所有源代码与数据文件打包成文件”学号-姓名-lab5.tar.gz...

qq_40165417的博客 7331

KMD 核心功能模块——命令提交与调度:Ring Buffer 与硬件引擎交互

《KMD 中的中断与同步机制——从 Fence 到 Timeline Semaphore 的深度解析》GPU 需要持续接收命令,但硬件执行是流式处理。Ring Buffer 作为。导致 CVE-2022-1234(GPU 挂起),修复后强制检查。:命令提交延迟从 50μs 降至 5μs(20 倍提升)。,CPU 通过写入该地址更新指针(避免直接操作寄存器)。,实现 CPU 与 GPU 的高效协同。),GPU 读指针更新是硬件自动完成的。(通过硬件状态机),实现真正的零等待。AMDGPU 驱动曾因。

amy_mhd的博客 82

头歌实验4:Linux系统的进程控制(编程实验)

头歌实验4:Linux系统的进程控制(编程实验)

qq_62791684的博客 1万+

YOLOv5算法改进(22)— 更换主干网络MobileNetv3 + 添加CA注意力机制

本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络MobileNetv3 + 添加CA注意力机制),小白必学~!🌈

小哥谈 2816

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Linux操作系统编程】实验四 | 进程控制实验

文章目录fork()exec系列函数waitpid() 参考资料:实验4-进程控制实验 #include <unistd.h> pid_t fork(void) // 创建子进程 int execl(const char *pathname, const char *arg0, .../*(char*)0*/) 、、 进程中执行另外一个可执行文件 #include <sys/wait.h> pid_t waitpid(pid_t pid, int *statloc, int o

py今天刷题了吗 476

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Linux基本操作、进程控制、shell编程

也了解到僵尸进程是有危害的,进程的退出状态必须被维持下去,因为它要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。Shell语句类似于c语言,又不同c语言,由于其命令识别的特殊性,某一处是否需要添加空格是代码是否正常运行的关键,需要我们熟悉shell的语法和结构(顺序、分支和循环)以及注意shell符合,如判断大小可以用语句(-lt,-gt)或者>,<,但是前面需要加转义符\,否则会被解释为重定向,这些都是需要通过书本和网络学习,在实操中改进,只有动手,才能切实学会其使用规则。

m0_64287066的博客 433

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【操作系统】实验二 进程控制实验

本人一直想找时间系统整理一下之前做过的一些实验,便于后续用到的时候可以尽快的使用,po出来也便于大家交流学习,有问题欢迎交流指正,与诸君共勉!操作系统实验二,进程控制。

AGATHA_66的博客 4863

实验一 进程控制实验

5. 编程创建2个子进程,子进程1运行指定路径下的可执行文件(如:/home/student/welcome.out),子进程2暂停10s之后退出,父进程先用阻塞方式等待子进程1的结束,然后用非阻塞方式等待子进程2的结束,待收集到二个子进程结束的信息,父进程就返回。通过实验中的信号处理,我们可以向进程发送信号,从而实现对进程的控制。先打印父进程 然后创建第一个子进程p1,然后父进程创建第二个子进程p2,如果不想让父进程在子进程结束之前结束,可以用wait(0)让父进程等待子进程结束,之后父进程再结束。

G856569566的博客 1143

linux系统程序问题报告,Linux程序设计实验报告.docx

Linux程序设计实验报告.docx Linux程序设计实验指导书实验类别课内实验 实验课程名称Linux程序设计实验室名称软件工程专业实验室 实验课程编号 000 总 学 时32 学 分 2 适用专业软件工程 先修课程Linux操作系统、C程序设计实验在教学培养计划中地位、作用通过讲授Linux的操作使用、系统结构和Linux环境下的程序设计,使学生对Linux操作系统获得一个全面的认识和掌握。...

weixin_42297446的博客 464

Linux实验三父子进程每隔3秒,实验三进程的创建和简单控制(学生分析.doc

实验三进程的创建和简单控制(学生分析实验 进程的创建和简单控制实验目的:掌握进程的概念和进程的状态,对进程有感性的认识;掌握进程创建方法;认识进程的并发执行,了解进程族之间各种标识及其存在的关系;熟悉进程的创建、阻塞、唤醒、撤销等控制方法。实验内容:了解有关Linux进程的属性和进程的层次结构;学习有关Linux的前台后台进程;学习有关Linux命令的顺序执行和并发执行;学习有关挂起和终止进程;...

weixin_39667080的博客 457

linux下的程序开发实验,Linux程序实验.docx

Linux程序实验《Linux程序设计》教学大纲Linux Program Design课程类别:学科专业教育课程 课程名称:Linux程序设计开课单位:软件学院课程编号:总 学 时:32 学 分:2适用专业:软件工程先修课程:程序设计基础一、课程在教学计划中的地位、作用通过讲授Linux的操作使用、系统结构和Linux环境下的程序设计,使学生对Linux操作系统获得一个全面的认识和掌握。一...

weixin_42422285的博客 251

操作系统实验: 进程管理

一.实验目的: 1. 加深对进程概念的理解,明确进程与程序的区别。 2.进一步理解并发执行的实质。 3.分析进程争用系统资源的情况,学习解决进程互斥的方法。 4.了解Linux中进程通信的基本方法。 二.实验要求: 在linux系统上用C语言编写程序,分析程序运行结果及原因,加深对进程管理的理解。 实验内容: 进程的创建 编写一段程序,使用系统调用fork() 创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子...

qq_50542009的博客 1万+

操作系统实验一 进程/线程管理

通过实现进程队列的管理,能够模拟进程的生命周期,掌握了如何使用队列来管理进程的调度。cout processName

hxj_686的博客 2244

进程创建(实验3)

进程创建 1.实验目的 ① 了解和掌握linux操作系统的基本操作 ② 了解并掌握创建进程的工作原理 2.实验平台 操作系统:Linux 3.实验内容和要求 (一)操作实验任务 ① 使用ls命令查看文件的权限 ② 使用chown修改文件的所属权 ③ 使用chmod 修改文件的访问权限 ④ 采用字符设定法,添加一个权限,比如:chmod u+w,g+r,o+r file1;减少一个权限, chmod u-x,g-w,o-w file1 ⑤ 采用数字设定法修改权限,比如:chmod 755 file1 (二)

JZ_TONGXIE 4051
上一篇: 编写程序测量 pthread_create、fork 两个函数的运行时间,并进行实测比较
下一篇: 1512. 好数对的数目
enjoy_code_
博客等级 码龄7年 1251粉丝 78原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值