至少对于Linux、FreeBSD、Solaris、AIX这四种操作系统,有一种办法。不要安装传
统sa_handler信号句柄,而是安装sa_sigaction信号句柄。细节请man sigaction并
参照头文件加强理解。下面是一个可移植演示程序。
--------------------------------------------------------------------------
/*
* For x86/Linux RedHat_8 2.4.18-14
* For x86/FreeBSD 4.5-RELEASE
* For SPARC/Solaris 8
* For AIX 4.3.3.0
*
* gcc -Wall -pipe -O3 -s -o siginfo_test siginfo_test.c
*/
/************************************************************************
* *
* Head File *
* *
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <signal.h>
#include <unistd.h>
#include <setjmp.h>
#include <sys/time.h>
/************************************************************************
* *
* Macro *
* *
************************************************************************/
/*
* for signal handlers
*/
typedef void Sigfunc ( int, siginfo_t *, void * );
#define PRIVATE_SIG_ERR ((Sigfunc *)-1)
/************************************************************************
* *
* Function Prototype *
* *
************************************************************************/
static void Atexit ( void ( * func ) ( void ) );
static void init_signal ( void );
static void init_timer ( unsigned int s );
static void on_alarm ( int signo, siginfo_t *si, void *unused );
static void on_segvbus ( int signo, siginfo_t *si, void *unused );
static void on_terminate ( int signo, siginfo_t *si, void *unused );
static Sigfunc * PrivateSignal ( int signo, Sigfunc *func );
static int Setitimer ( int which,
struct itimerval *value,
struct itimerval *ovalue );
static Sigfunc * Signal ( int signo, Sigfunc *func );
static void terminate ( void );
/************************************************************************
* *
* Static Global Var *
* *
************************************************************************/
static sigjmp_buf jmpbuf;
static volatile sig_atomic_t canjump = 0;
/************************************************************************/
static void Atexit ( void ( * func ) ( void ) )
{
if ( atexit( func ) != 0 )
{
exit( EXIT_FAILURE );
}
return;
} /* end of Atexit */
/*
* 初始化信号句柄
*/
static void init_signal ( void )
{
unsigned int i;
Atexit( terminate );
for ( i = 1; i < 9; i++ )
{
Signal( i, on_terminate );
}
Signal( SIGTERM, on_terminate );
Signal( SIGALRM, on_alarm );
Signal( SIGSEGV, on_segvbus );
Signal( SIGBUS , on_segvbus );
return;
} /* end of init_signal */
/*
* 我们的定时器精度只支持到秒
*/
static void init_timer ( unsigned int s )
{
struct itimerval value;
value.it_value.tv_sec = s;
value.it_value.tv_usec = 0;
/*
* 只生效一次
*/
value.it_interval.tv_sec = 0;
value.it_interval.tv_usec = 0;
Setitimer( ITIMER_REAL, &value, NULL );
return;
} /* end of init_timer */
static void on_alarm ( int signo, siginfo_t *si, void *unused )
{
fprintf
(
stderr,
"/n"
"signo = %d/n"
"si = 0x%08X/n"
"unused = 0x%08X/n",
signo,
( unsigned int )si,
( unsigned int )unused
);
if ( NULL != si )
{
fprintf
(
stderr,
"si->si_signo = %d/n"
"si->si_errno = %d/n"
"si->si_code = %d/n"
"si->si_pid = %u/n"
"si->si_uid = %u/n"
"si->si_status = %d/n"
"si->si_addr = 0x%08X/n",
si->si_signo,
si->si_errno,
si->si_code,
( unsigned int )si->si_pid,
( unsigned int )si->si_uid,
( int )si->si_status,
( unsigned int )si->si_addr
);
}
return;
} /* end of on_alarm */
static void on_segvbus ( int signo, siginfo_t *si, void *unused )
{
fprintf
(
stderr,
"/n"
"signo = %d/n"
"si = 0x%08X/n"
"unused = 0x%08X/n",
signo,
( unsigned int )si,
( unsigned int )unused
);
if ( NULL != si )
{
fprintf
(
stderr,
"si->si_signo = %d/n"
"si->si_errno = %d/n"
"si->si_code = %d/n"
"si->si_pid = %u/n"
"si->si_uid = %u/n"
"si->si_status = %d/n"
"si->si_addr = 0x%08X/n",
si->si_signo,
si->si_errno,
si->si_code,
( unsigned int )si->si_pid,
( unsigned int )si->si_uid,
( int )si->si_status,
( unsigned int )si->si_addr
);
}
if ( 0 == canjump )
{
/*
* unexpected signal, ignore
*/
return;
}
canjump = 0;
/*
* jump back to main, don't return
*/
siglongjmp( jmpbuf, signo );
} /* end of on_segvbus */
/*
* 参如下头文件了解siginfo_t定义
*
* Linux /usr/include/bits/siginfo.h
* FreeBSD /usr/include/sys/signal.h
* Solaris /usr/include/sys/siginfo.h
* AIX /usr/include/sys/signal.h
*
* 第三形参不推荐使用,context相关。
*/
static void on_terminate ( int signo, siginfo_t *si, void *unused )
{
/*
* 就上四种OS而言,测试Solaris,执行siginfo_test,按Ctrl-C进入该流程时
* si为NULL,其他三种系统则不同。
*/
if ( NULL != si )
{
/*
* 演示用,不推荐在信号句柄中使用fprintf()
*/
fprintf
(
stderr,
"/n"
"signo = %d/n"
"si = 0x%08X/n"
"unused = 0x%08X/n"
"si->si_signo = %d/n"
"si->si_errno = %d/n"
"si->si_code = %d/n",
signo,
( unsigned int )si,
( unsigned int )unused,
si->si_signo,
si->si_errno,
si->si_code
);
/*
* si_code为SI_USER时意味着"signal sent by another process with kill()"
*
* 就上四种OS而言,我所测试的FreeBSD反应与其他三种不同,kill进程时
* si_code始终为0,而FreeBSD有如下定义:
*
* #define SI_USER 0x10001
*
* 如果不判断si_code,强行显示si_pid、si_uid,对于FreeBSD而言总是0。
* 下面出于方便演示目的,没有判断si_code。正确作法应该判断si_code,
* 然后显示联合的不同成员。
*/
fprintf
(
stderr,
"si->si_pid = %u/n"
"si->si_uid = %u/n"
"si->si_status = %d/n"
"si->si_addr = 0x%08X/n",
( unsigned int )si->si_pid,
( unsigned int )si->si_uid,
( int )si->si_status,
( unsigned int )si->si_addr
);
}
else
{
fprintf
(
stderr,
"/n"
"signo = %d/n"
"si = 0x%08X/n"
"unused = 0x%08X/n",
signo,
( unsigned int )si,
( unsigned int )unused
);
}
/*
* 这次我们使用atexit()函数
*/
exit( EXIT_SUCCESS );
} /* end of on_terminate */
/*
* 与以前版本不同之处在于使用sa_sigaction,而不是sa_handler。
*/
static Sigfunc * PrivateSignal ( int signo, Sigfunc *func )
{
#if 0
from Linux /usr/include/bits/sigaction.h
struct sigaction
{
union
{
/*
* Used if SA_SIGINFO is not set.
*/
__sighandler_t sa_handler;
/*
* Used if SA_SIGINFO is set.
*/
void ( *sa_sigaction ) ( int, siginfo_t *, void * );
} __sigaction_handler;
#define sa_handler __sigaction_handler.sa_handler
#define sa_sigaction __sigaction_handler.sa_sigaction
/*
* Additional set of signals to be blocked.
*/
__sigset_t sa_mask;
/*
* Special flags.
*/
int sa_flags;
/*
* The sa_restorer element is obsolete and should not be used.
* POSIX does not specify a sa_restorer element.
*
* Restore handler.
*/
void ( *sa_restorer ) ( void );
};
#endif
struct sigaction act, oact;
memset( &act, 0, sizeof( act ) );
sigemptyset( &act.sa_mask );
/*
* Invoke signal-catching function with three arguments instead of one.
*/
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = func;
if ( SIGALRM == signo )
{
#ifdef SA_INTERRUPT
/*
* SunOS 4.x
*/
act.sa_flags |= SA_INTERRUPT;
#endif
}
else
{
#ifdef SA_RESTART
/*
* SVR4, 4.4BSD
*/
act.sa_flags |= SA_RESTART;
#endif
}
if ( sigaction( signo, &act, &oact ) < 0 )
{
return( PRIVATE_SIG_ERR );
}
return( oact.sa_sigaction );
} /* end of PrivateSignal */
static int Setitimer ( int which, struct itimerval *value, struct itimerval *ovalue )
{
int ret;
if ( ( ret = setitimer( which, value, ovalue ) ) < 0 )
{
perror( "setitimer error" );
exit( EXIT_FAILURE );
}
return( ret );
} /* end of Setitimer */
static Sigfunc * Signal ( int signo, Sigfunc *func )
{
Sigfunc *sigfunc;
if ( PRIVATE_SIG_ERR == ( sigfunc = PrivateSignal( signo, func ) ) )
{
perror( "signal error" );
exit( EXIT_FAILURE );
}
return( sigfunc );
} /* end of Signal */
static void terminate ( void )
{
/*
* _exit( EXIT_SUCCESS );
*/
return;
} /* end of terminate */
int main ( int argc, char * argv[] )
{
/*
* for autovar, must be volatile
*/
volatile unsigned char *p;
init_signal();
p = ( unsigned char * )&p;
if ( 0 != sigsetjmp( jmpbuf, 1 ) )
{
printf
(
"p = 0x%08X/n",
( unsigned int )p
);
goto main_continue;
}
/*
* now sigsetjump() is OK
*/
canjump = 1;
while ( 1 )
{
/*
* 诱发SIGSEGV、SIGBUS
*/
*p = *p;
p++;
}
main_continue:
/*
* 启动定时器
*/
init_timer( 1 );
while ( 1 )
{
/*
* 形成阻塞,降低CPU占用率
*/
getchar();
}
return( EXIT_SUCCESS );
} /* end of main */
/************************************************************************/
--------------------------------------------------------------------------
这种技术是操作系统实现相关的。FreeBSD的si_code与头文件不相符。除了FreeBSD,
其他三种OS的si_addr如愿反映了栈底地址、si_pid/si_uid也能正确反映kill()信号
源。而Solaris会出现si为NULL的情形。下面是Linux上执行示例:
[scz@ /home/scz/src]> ./siginfo_test
signo = 11
si = 0xBFFFF6B0
unused = 0xBFFFF730
si->si_signo = 11
si->si_errno = 0
si->si_code = 1
si->si_pid = 3221225472
si->si_uid = 1869479936
si->si_status = 2712942
si->si_addr = 0xC0000000 <= 栈底地址
p = 0xC0000000
signo = 14
si = 0xBFFFF5A8
unused = 0xBFFFF628
si->si_signo = 14
si->si_errno = 0
si->si_code = 128 <= SI_KERNEL 0x80 Send by kernel.
si->si_pid = 0
si->si_uid = 0
si->si_status = 896820224
si->si_addr = 0x00000000
^Z
[scz@ /home/scz/src]> bg %1
[scz@ /home/scz/src]> kill %1
signo = 15
si = 0xBFFFF5A8
unused = 0xBFFFF628
si->si_signo = 15
si->si_errno = 0
si->si_code = 0 <= SI_USER 0x00 Sent by kill, sigsend, raise.
si->si_pid = 27712 <= kill()信号源
si->si_uid = 1000 <= kill()信号源
si->si_status = 896820224
si->si_addr = 0x00006C40
[scz@ /home/scz/src]> echo $
27712
[scz@ /home/scz/src]> id
uid=1000(scz) gid=0(root) groups=0(root)
[scz@ /home/scz/src]>
最后结论,对于x86/FreeBSD 4.5-RELEASE,无法利用该技术分辨kill()信号源。其
他三种操作系统可以利用该技术。
一个有趣的想法,进程分辨出kill()信号源,反向kill信号源。
相关推荐
RK3588平台开发系列讲解(进程篇)Linux 进程的数据结构
📢 本篇将介绍 Linux 如何表示进程。
IBM/AIX下找到占用指定端口的进程并杀死它
IBM/AIX 下找到占用指定端口的进程并杀死它 零、Windows下的方法 > netstat -ano | find "1521" TCP 0.0.0.0:1521 0.0.0.0:0 LISTENING 2024 > taskkill /pid 2024 一、相关方法的参考资料(转载) 1:...
RK3588平台开发系列讲解(进程篇)Linux中进程的一生
📢本篇将介绍 Linux 进程的相关知识。
AIX 进程控制
1.The ps command displays process status information. $ ps -f
Linux: signal: 怎么知道是谁kill了当前进程
如果不能使用strace,就需要在程序里注册一个信号处理的函数,来读取这个siginfo_t 结构体里的信息。里面的si_pid信息就是发送SIGTERM的进程/线程的pid。
4篇1章5节:macOS 本地部署的进程管理
本文详细介绍了在macOS系统中进行故障排查和进程管理的核心方法,特别针对本地AI模型运行场景。文章系统讲解了PID概念、前后台进程区别、活动监视器使用、终端命令(top/htop)监控、进程终止(kill/kill-9)等关键技术,并比较了图形界面与命令行工具的优劣势。重点分析了在AI模型运行出现卡死、资源占用过高等情况时的排查思路和解决方案,为macOS用户提供了完整的系统维护和AI模型运维指南。
linux如何手动kill vnc端口并修改分辨率
linux如何手动kill vnc端口并修改分辨率 一、正常的kill端口流程及修改分辨率流程 在新的端口上su 需要kill的vnc的用户名,并正确输入密码; $su zhangsan kill命令; $/usr/bin/vncserver -kill : 36(端口号) 自定义分辨率; $vncserver -geometry 1920x950 -depth 24 :36(端口号) 二、手动kill端口流程及修改分辨率流程 如果在kill命令执行后报如下错误: $/usr/bin/
UR10e+D435+ag95夹爪 gazebo 仿真记录(一)
学习仿真环境gazebo下利用UR10e机械臂搭建模拟平台,此博客用于记录搭建过程!!主要参考光头明明、总有一天全城的人都要高看我们和bug404_三位博主。最终自己功能包的主要参考了bug404_的ur_platform,感觉这个结构比较合理。运行环境:Ubuntu18.04+Ros-melodic+Gazebo9。
Linux——使用kill结束进程并恢复进程(详细图文教程)
Linux——使用kill结束进程并恢复进程
混合动作空间在强化学习中的创新应用:PDQN与MPDQN算法解析
本文深入解析了强化学习中处理混合动作空间的PDQN与MPDQN算法。针对既有离散选择又有连续调节的复杂决策场景,PDQN通过参数化深度Q网络,巧妙结合DQN与DDPG进行交替优化;MPDQN则进一步改进,为每个离散动作提供专属参数评估以减少干扰。文章通过游戏、自动驾驶等实例阐述了其应用价值与面临的挑战。
深入RK3588嵌入式Linux开发:uboot源码定制化移植实战
本文详细介绍了RK3588嵌入式Linux开发中,如何绕过庞大的官方SDK,从官方仓库获取纯净U-Boot源码并进行定制化移植的完整实战流程。内容包括编译环境搭建、交叉工具链配置、源码结构解析、设备树(Device Tree)修改、环境变量定制、编译脚本编写以及常见问题调试技巧,旨在帮助开发者深入理解系统引导过程,掌握为定制硬件适配U-Boot的核心技能。
linux的kill命令中INT,Linux系统 kill命令
[root@linux ~]# kill -signal %jobnumber[root@linux ~]# kill -l参数:-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?共有62个信号。signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:-1 :重新读取一次参数的设定档 (类似 reload);-2 :代...
保姆级教程:中科蓝讯Downloader配置详解,从软硬开关机到EQ调音一步到位
本文详细介绍了中科蓝讯Downloader的配置流程,从硬件初始化到音频调优的全方位指南。涵盖软硬开关机选择、电源管理、DAC校准、EQ调音等关键步骤,帮助开发者高效完成配置并避免常见问题。特别适合需要精确控制音频设备和电源管理的中科蓝讯芯片开发者。
Linux——Process(进程)相关命令——ps、nice、kill、bg&fg
文章目录Process简单认识几个关于Linux Process的重要角色细心地,有个问题:psnicekillbg&fg Process简单认识 进程就是被执行的程序。 每个进程都是一个运行的实体, 都有自己的地址空间,并占用一定的系统资源。 口说话地说: 就好比, 写了一份活动策划书(程序代码), 然后 ,让相关人员(比如操作系统) 按照策划书,有条不紊地举行活动(进程) 换专业一点点的说: 程序,是人类用编程语言编写的,可实现一定功能,并且可执行的代码集合。 而进程是正在执行中的程序
手把手教你用芯驰X9HP驱动MAX96755/MAX96752点亮智能座舱仪表屏(附完整寄存器配置表)
本文详细介绍了如何使用芯驰X9HP驱动MAX96755/MAX96752实现智能座舱仪表屏的完整开发流程,包括硬件架构解析、关键寄存器配置、Linux BSP集成及调试技巧。通过实战指南和完整寄存器配置表,帮助开发者快速掌握驱动开发核心技术,提升智能座舱系统的显示性能与稳定性。
从Verilog到GDS:手把手教你搞定Calibre LVS物理验证(附常见报错解决)
本文详细介绍了从Verilog到GDS的Calibre LVS物理验证全流程,包括工具链配置、RTL到SPICE网表转换、LVS运行配置及高级技巧。重点解析了常见报错如网络不匹配、器件不匹配和电源引脚缺失的解决方案,帮助工程师高效完成芯片物理验证,确保设计正确性。
kill命令
1) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出 2) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略. 3) SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和 处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这 个信号.
uniapp实现app版本发现新版本后,自动更新
app实现自动更新
vnc分辨率修改
最近一直在用putty或Xshell登录linux服务器,今天用ultraVNC Viewer登录服务器时发现自己的vnc服务器挂掉了。在此,整理下vnc操作的基本命令。查看vnc进程:ps -ef | grep vnc 该命令可以列出当前系统上所有用户vnc界面的端口号,分辨率等信息。 我们要用到的只是端口号。杀掉自己vnc端口对应的进程vncserver -kill :43 我的端口号是4
eNSP中玩转Python自动化——解锁网工新姿势(一)
Python自动化一、安装Paramiko模块二、搭建实验环境1、桥接电脑网卡2、配置交换机IP地址交换机配置测试ensp的交换机与电脑的连通性:交换机配置SSHXshell验证三、Python脚本1、执行python脚本2、同步成功 一、安装Paramiko模块 首先安装Python3 然后安装pip解释器 最后安装Paramiko模块 Windows+R打开Cmd,输入命令: pip3 install paramiko 进入python,导入 paramiko模块: import paramiko
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
Linux—进程间通信和同步(信号)
信号 信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制。它用于在一个或多个进程之间传递异步信号。信号可以由各种异步事件产生,例如键盘中断等。Shell也可以使用信号将作业控制命令传递给它的子进程。 Linux系统中定义了一系列的信号,这些信号可以由内核产生,也可以由系统中的其他进程产生,只要这些进程有足够的权限。可以使用kill命令(kill -l)在机器上列出所有的信号,...
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
进程概念(详解)
进程概念 创建进程 fork函数 进程优先级 进程地址空间 环境变量 命令行参数 进程状态 僵尸进程 孤儿进程
深度学习工具包 DeepLearningToolbox
深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[](https://bitdeli.com/free "Bitdeli Badge")
VB摄像头监控
该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制
教你如何找到正在运行中的进程 ID 并杀死它
在 “进程Processes” 标签页下找到你的进程,右击进程名字打开快捷菜单,选择选项 “杀死Kill”。你可以右击列表里的进程或应用并选择“杀死Kill”来终止进程。你的 Linux 系统中运行的应用可能会让你的电脑变慢,特别是你的电脑配置较低的时候。在这篇指南中,我们将会解释用不同的方法以杀死 Linux 中的运行进程。这就是你该如何在 Linux 中找到一个运行中的进程的 PID 并杀死它。记住,你只应该杀死未响应的进程,或者你发现应用无法被正常关闭 (针对基于 GUI 的应用)。
七、Linux进程(一)
程序:二进制文件,占用的磁盘空间进程: 启动的程序,所有的数据都在内存中,需要占用更多的系统资源(cpu,物理内存)并发不是真正意义上的同时进行,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。如:打游戏和听音乐两件事情在都是在同一台电脑上完成了。那么,就可以说听音乐和打游戏是并发的。并行和并发的区别:并发,指的是多个事情,在同一时间段内同时发生了。
【C++与Linux基础】进程间的信号
本文摘要: 本文介绍了Linux系统中信号的基本概念与应用。通过实验代码演示了信号处理函数的使用方法,验证了Ctrl+C发送的是2号信号(SIGINT)。测试发现9号(SIGKILL)和19号(SIGSTOP)信号不可被自定义捕获,这是操作系统的保护机制。文章对比了信号与信号量的区别,前者用于进程间异步通知,后者用于资源同步控制。最后介绍了kill系统调用的基本用法。通过实践展示了信号在Linux进程通信中的重要作用。(149字)
1117



被折叠的 条评论
为什么被折叠?



