process -- 8




200x200


关于线程与信号的遗留问题1. 能否 kill 掉进程的一个线程而不影响其他线程2. 给进程发送信号,是只有调用线程会收到信号,还是全部线程都收到a. 

#技术帖    #技术分享    #进程    #线程   
nginx 的互斥锁nginx 自己实现了互斥锁,这样做的目的主要是为了兼容性,在不支持锁甚至不支持原子操作的环境下实现锁操作 nginx 锁结构ngx_accept_mutex 是一个 ngx_shmtx_t 结构体,ngx_shmtx_t 描述了 nginx 的锁结构// struct ngx_shmtx_t // nginx 锁结构 {{{ typedef struct { #if (NGX_HAVE_ATOMIC_OPS) // 是否支持原子操作 ngx_atomic_t *lock; #if (NGX_HAVE_POSIX_SEM) // 是否支持信号量 ngx_atomic_t *wait; ngx_uint_t semaphore; sem_t sem; #endif #else // 不支持原子操作则使用文件操作 ngx_fd_t fd; u_char *name; #endif ngx_uint_t spin; // 自旋锁标识 } ngx_shmtx_t; // }}}  nginx 使用这个结构实现了&n
#技术帖    #龙潭书斋    #fcntl    #进程   
worker 进程的批量创建 -- ngx_spawn_process// ngx_pid_t // ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, // char *name, ngx_int_t respawn) // 创建子进程 {{{ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn) { u_long on; ngx_pid_t pid; ngx_int_t s; if (respawn >= 0) { s = respawn; } else { // 如果进程已退出,则使用该节点存储新的进程信息 for (s = 0; s < ngx_last_process; s++) { if (ngx_processes[s].pid == -1) { break; }
#技术帖    #linux    #socket    #龙潭书斋   
概念所谓的死锁,就是两个或两个以上的进程在执行过程中,因为争夺某个资源而造成的相互等待的现象,如果没有外力作用,则他们都会因为等待而无法继续执行,死锁有时也称为“抱死”死锁的条件死锁的发生必须具备以下四个条件:互斥条件 -- 进程对分配到的资源进行排他性使用,即在一段时间内,某资源只能由一个进程占用,其他需要使用该资源的进程则必须等待请求和保持条件 -- 进程已经占用了某个排他性资源,但又提出了新的资源请求,而该资源又被其他进程占用,因此,此时执行进程阻塞,但又不释放自己已持有的资源不剥夺条件 -- 进程已获得资源在未使用完之前,不能被剥夺,只能在使用完之后由自己释放环路等待条件 -- 即P0正在等待P1占用的资源;P1正在等待P2占用的资源。。。Pn正在等待P0占用的资源,形成资源的环形链 
#读书笔记    #技术帖    #操作系统    #os   
进程原语与线程原语的比较进程原语线程原语描述forkpthread_create创建新的控制流exitpthread_exit从现有控制流中退出waitpidpthread_join从控制流中得到退出状态atexitpthread_cleanup_push注册退出控制流时调用的函数getpidpthread_self获取当前控制流IDabortpthread_cancle请求控制流的非正常退出 
#读书笔记    #技术帖    #linux    #unix   
概念又称僵尸进程,在子进程退出时,会将子进程的有关信息发送给父进程,让其父进程对其进行善后处理(如释放他仍占用的资源),如果他的父进程没有对 SIGCHLD 做出响应或忽略该信号或调用 waitpid 等待子进程结束,则子进程无法正常结束而成为僵死进程,即使是 root 身份调用 kill -9 命令也不能杀死僵死进程 将死进程通过 ps 命令查看其标志为 Z 避免产生僵死进程的方法1、waitpid子进程死后,会发送 SIGCHLD 信号给父进程,父进程收到此信号后会执行 waitpid 函数为子进程收尸2、处理 SIGCHLD 信号父进程可以对 SIGCHLD 信号进行响应,在处理函数中执行默认的处理或显示忽略该信号,则系统会自动释放子进程资源而避免使子进程成为僵死进程3、杀死父进程由于父进程死后,子进程以及僵死进程会成为孤儿进程,会被过继给守护进程(pid为1的init进程),init进程会负责清理僵死进程4、fork 两次在建立子进程时,使用2次fork,让所建立的子进程成为父进程的孙子进程,而实际中的子进程则随即推出,和第三条相同,由于孙子进程的
#技术帖    #linux    #unix    #apue   
信号集是一个用来表示多个信号的数据类型作为很多信号处理函数的参数,用来告诉内核不允许发生信号集中的信号因为信号数目可能超过一个整型量所能表示的最大值,因此,POSIX定义了数据类型 sigset_t 以包含一个信号集 以下是五个信号集处理函数:int sigemptyset(sigset_t *set); int sigfillset(sigset_t * set); int sigaddset(sigset_t *set,int signum); int sigdelset(sigset_t * set,int signum); int sigismember(const sigset_t *set,int signum); 前四个函数若调用成功则返回0,否则返回-1第五个函数如果信号在该信号集中,则返回1,否则返回0,调用出错返回-1 所有应用程序在使用信号集前,需要首先通过调用 sigemptyset 或 sigfillset 函数初始化信号集,让信号集变成空集或包含所有信号然后,可以调用 sigaddset 或 sigdelset 函数在信号集中增加或删除信号,调用 sigismember 测试信号是否存在于信号集中&nbs
#读书笔记    #技术帖    #linux    #unix   
终止进程快捷键的区别 -- CTRL + Z + C + / + 4 + DCTRL+C 发送 SIGINT 信号给前台进程组中的所有进程。常用于终止正在运行的程序CTRL+Z 发送 SIGTSTP 信号给前台进程组中的所有进程,常用于挂起一个进程CTRL+/ 部分UNIX系统也实现为 CTRL+4,发送 SIGQUIT 信号给前台进程组中的所有进程,终止前台进程并生成 core 文件,通常存放在 /proc/sys/kernel 目录下,以进程 pid 命名CTRL+D 发送一个特殊的二进制值,表示EOF SIGKILL、SIGTERM、SIGQUIT、SIGINT 区别SIGINT CTRL+C 将发送该信号,用于终止前台进程组中的所有进程(只能终止前台进程),可以在进程中捕获SIGTERM 没有关联任何按键,只能由进程或命令发送,可以终止任何进程,也可以在进程中捕获SIGQUIT CTRL+\(部分实现为 CTRL+4)将
#技术帖    #linux    #unix    #技术分享   



京ICP备15018585号