当前位置: 技术问答>linux和unix
关于信号和内存的三个有意思的问题
来源: 互联网 发布时间:2016-03-07
本文导语: (1)bash编译的是静态连接的还是动态连接的?如果是动态的如何能搞成静态的(编译的时候没有象busybox一样可以选择静态还是动态)? (2)看一些人说,user空间访问kernel空间的变量有三种方式:系统调用、/proc/kcore、/dev/mem ,...
(1)bash编译的是静态连接的还是动态连接的?如果是动态的如何能搞成静态的(编译的时候没有象busybox一样可以选择静态还是动态)?
(2)看一些人说,user空间访问kernel空间的变量有三种方式:系统调用、/proc/kcore、/dev/mem ,后两种方式到底怎么用,能否具体点?
(3)进程被killed的时候,通常是系统发个信号,信号的默认处理函数是kill进程,那么被kill后,能否死个明白,即有方法知道我是被那个信号杀了的呢?最简单的可能是用自己的信号处理函数去重置默认的,但是这也太变态了。
望高手指点!
|
1.user空间不能直接访问内核空间,内核为了将数据传到用户空间,就提供了系统调用这样一种接口。
2./proc/kcore是物理内存的映像文件,用户可以直接去读物理内存,而不用受内核空间的访问限制。
3./dev/mem 是将内核空间内存映射到用户空间上,然后通过/dev/mem去访问,感觉好像在访问用户空间,其实已经被映射到内核空间了。
2./proc/kcore是物理内存的映像文件,用户可以直接去读物理内存,而不用受内核空间的访问限制。
3./dev/mem 是将内核空间内存映射到用户空间上,然后通过/dev/mem去访问,感觉好像在访问用户空间,其实已经被映射到内核空间了。
|
我也是初学者,共同进步!
(1)对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。
其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是动态链接库(dynamic link library)技术。
可以用ldd命令查看命令是否依赖与某个动态链接库,带参数编译可以选择动态或者静态编译。具体的查点资料吧!
(2)也不懂
(3)unix环境高级编程中提到:SIGKILL和SIGSTOP不能忽略或捕捉,它向系统管理员提供一种可以杀死任一进程的可靠方法。所以你是无法重置自己的信号处理函数来确认进程是怎么死的,也许你可以通过它的父进程来得到它的终止状态。
(1)对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件名为“libxxx.a”的形式。
其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是动态链接库(dynamic link library)技术。
可以用ldd命令查看命令是否依赖与某个动态链接库,带参数编译可以选择动态或者静态编译。具体的查点资料吧!
(2)也不懂
(3)unix环境高级编程中提到:SIGKILL和SIGSTOP不能忽略或捕捉,它向系统管理员提供一种可以杀死任一进程的可靠方法。所以你是无法重置自己的信号处理函数来确认进程是怎么死的,也许你可以通过它的父进程来得到它的终止状态。
|
3 进程被killed的时候,通常是系统发个信号,信号的默认处理函数是kill进程,那么被kill后,能否死个明白,即有方法知道我是被那个信号杀了的呢?最简单的可能是用自己的信号处理函数去重置默认的,但是这也太变态了。
信号是一种软中断,在系统内部的处理方式是:当有信号被发送给某个进程时,只是把进程内的一个信号表置位,表示有什么信号到达该进程。当进程从内核准备退出时,会检查该信号表,并调用相应的信号函数来处理。如果你没有设置相应的信号处理函数,系统会根据默认设置来处理该信号,补充一点,并不是所有信号的默认处理都是把进程kill掉的。
如果你要想知道什么信号到达该进程,正确的方法就是设置自己的信号处理函数。
你还可以设置信号屏蔽,屏蔽掉你认为不需要的信号。不过这种做法一般只是在程序内你认为关键的区域且运行过程中不希望被打断的地方使用。
如楼上所讲,SIGKILL和SIGSTOP不能被屏蔽.
信号是一种软中断,在系统内部的处理方式是:当有信号被发送给某个进程时,只是把进程内的一个信号表置位,表示有什么信号到达该进程。当进程从内核准备退出时,会检查该信号表,并调用相应的信号函数来处理。如果你没有设置相应的信号处理函数,系统会根据默认设置来处理该信号,补充一点,并不是所有信号的默认处理都是把进程kill掉的。
如果你要想知道什么信号到达该进程,正确的方法就是设置自己的信号处理函数。
你还可以设置信号屏蔽,屏蔽掉你认为不需要的信号。不过这种做法一般只是在程序内你认为关键的区域且运行过程中不希望被打断的地方使用。
如楼上所讲,SIGKILL和SIGSTOP不能被屏蔽.