本文主要是介绍socket/ptrace,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. socket
(1). 介绍
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。
(2). 服务器端建立 (socket -> bind -> listen -> accept -> read/write)
程序通过调用socket函数(AF_LOCAL, SOCK_STREAM),建立了主动连接的套接字.
调用bind函数,将套接字与地址信息关联起来.
调用listen函数实现对该端口的监听,同时变为监听套接字.
当有连接请求时,通过调用accept函数建立与客户端的连接.
调用read/write函数来读取/发送消息,当然也可以使用recv/send函数实现相同的功能.
(3). 客户端建立 (socket -> connect -> read/write)
程序通过调用socket函数(AF_LOCAL, SOCK_STREAM) ,建立了主动连接的套接字。
调用connect函数(附带地址信息),向服务器端发出连接请求。
调用read/write函数来读取/发送消息,当然也可以使用recv/send函数实现相同的功能。
2. ptrace (process trace)
(1). 介绍
ptrace()是个系统调用,提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image (用于实现断点调试,代码分析)
修改被跟踪进程的空间(内存或寄存器)。
任何传递给被跟踪进程的信号(除了SIGKILL)都会使得这个进程进入暂停状态,这时跟踪进程通过wait()得知相关的状态并做相应的修改。
(2). 限制
不能跟踪进程init。不能跟踪自己。
(3). 功能
PTRACE_TRACEME
本进程被其父进程所跟踪。其父进程应该希望跟踪子进程,用于debugger。
PTRACE_ATTACH
跟踪指定pid 进程,成为pid的父进程,并停止pid进程。
PTRACE_DETACH
结束跟踪。
PTRACE_PEEKTEXT, PTRACE_PEEKDATA和PTRACE_POKETEXT, PTRACE_POKEDATA
读取/修改被跟踪进程的user space里的内存。
PTRACE_GETREGS, PTRACE_SETREGS、PTRACES_GETFPREGS, PTRACE_SETFPREGS、PTRACE_GETVFPREGS, PTRACE_SETVFPREGS
读取/修改被跟踪进程的通用/浮点寄存器值。
PTRACE_SYSCALL, PTRACE_CONT
重新运行,(PTRACE_SYSCALL会使每次系统调用暂停)。
PTRACE_SINGLESTEP
设置单步执行标志。
PTRACE_KILL
杀掉子进程,使它退出。
这篇关于socket/ptrace的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!