进程 -- 26




1 2 3

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    #进程   

200x200


信号量信号量与其他的 IPC (管道、FIFO、消息队列、域套接字)都有所不同,他是一个计数器,用于多进程对共享数据对象的访问当进程需要获得共享资源时,需要进行下列操作: 

#读书笔记    #技术帖    #linux    #unix   
消息队列此前已经介绍了 XSI PIC 的基本概念和一些用法XSI IPC 简介  这里我们介绍一下 XSI IPC 中的消息队列消息队列简称队列,其标识符被称为队列 ID(queue ID) 消息被添加到队列尾端,包含一个正长整型类型字段,一个非负长度以及实际数据字节消息队列并不一定要以先进先出次序取消息,也可以按照消息的类型字段取消息 消息队列结构 -- msqid_dsstruct msqid_ds { struct ipc_perm msg_perm; // ipc 权限结构 msgqnum_t msg_qnum; // 队列中的数据数 msglen_t msg_qbytes; // 队列的最大字节容量 pid_t msg_lspid; // 最近插入队列数据的进程 ID pid_t msg_lrpid; // 最近取出数据的进程 ID time_t msg_stime; // 最近入队时间 time_t msg_rtime; // 最近出队时间 time_t msg_ctime; // 最近更新时间 ... ... }  该结构描述了队列的当前状态,各系统的具体实现会包含额外的字段
#读书笔记    #技术帖    #龙潭书斋    #apue   
概述让进程在后台运行是一个常见的场景,只需在启动任务的命令最后加上 & 或运行过程中按下 CTRL+Z,再执行 bg 即可让任务在后台运行了但是如果此时我们关掉终端,或者由于网络问题突然断开连接,那么后台任务也就随之退出了那么,怎么才能让任务在后台可靠运行呢? 只运行单个临时任务 -- nohup / setsid / &我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程 nohup最常用的方法当然就是 nohup 了,顾名思义,就是让任务忽略 HUP 信号nohup sh test_task.sh > output.txt 2>&1 &  setsid除了让任务忽略 HUP 信号这样的方式以外,直接让任务脱离终端执行也就不会受到终端退出的影响了与 nohup 一样,只需在任务命令前加上 sets
#技术帖    #linux    #unix    #技术分享   
守护过程接下来,master 进程就要正式开始发挥他作为一个 daemon 进程的责任了,陷入循环,等待信号发生,做出相应处理ngx_new_binary = 0; delay = 0; sigio = 0; live = 1; for ( ;; ) { // 设定定时器,worker 定时退出 if (delay) { if (ngx_sigalrm) { sigio = 0; delay *= 2; ngx_sigalrm = 0; } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "termination cycle: %d", delay); itv.it_interval.tv_sec = 0; itv.it_interval.tv_usec = 0; itv.it_value.tv_sec = delay / 1000; itv.it_value.tv_usec = (delay % 1000 ) * 1000; // 设定精确的定时功能,以系统时间计算 if (setitimer(ITIMER_REAL, &itv, NULL) == -1) { ngx_log_erro
#技术帖    #network    #龙潭书斋    #进程   
daemon 进程关于 daemon 进程的介绍及创建以及需要注意的药店,请参考:daemon 守护进程 信号处理初始化nginx 有一个全局变量 signals,在 build configure 的时候写入到 os 目录下的 ngx_process.c 文件中,在不同的系统中取值不同,用来定义默认的信号处理方式// struct ngx_signal_t // 信号结构 {{{ typedef struct { int signo; char *signame; char *name; void (*handler)(int signo); } ngx_signal_t; // }}} // ngx_signal_t signals // 信号默认处理方式 {{{ ngx_signal_t signals[] = { { ngx_signal_value(NGX_RECONFIGURE_SIGNAL), "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL), "reload", ngx_signa
#技术帖    #linux    #network    #c语言   

200x200


概述top 命令是 linux 下常用的性能分析工具,能够实时监控系统中各进程的资源占用情况top 命令会动态显示,不停刷新,显示系统中 CPU&nb

#技术帖    #linux    #unix    #服务器   
概述通过 ps 命令可以查看到当前进程的状态ps 所列出的进程状态码如下表所示:进程状态码D不可中断 Uninterruptible sleep (usually IO)R正在运行,或在队列中的进程S处于休眠状态T停止或被追踪Z僵尸进程W进入内存交换(从内核2.6开始无效)X死掉的进程额外的状态标识
#技术帖    #linux    #unix    #技术分享   
概述实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一些辅助手段来达到目的。此外,GDB 也在较新内核上加入一些多进程调试支持。follow-fork-mode 方法在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。follow-fork-mode 的用法set follow-fork-mode [parent|child] parent: fork之后继续调试父进程,子进程不受影响。child: fork之后调试子进程,父进程不受影响。因此如果需要调试子进程,在启动gdb后:(gdb) set follow-fork-mode child 并在子进程代码设置断点。断开调试 -- detach-on-fork参数set detach-on-fork [on|off] on: 断开调试follow-fork-mode指定的进程。o
#技术帖    #linux    #unix    #c语言   
1 2 3



京ICP备15018585号