技术分享 -- 185




概念又称僵尸进程,在子进程退出时,会将子进程的有关信息发送给父进程,让其父进程对其进行善后处理(如释放他仍占用的资源),如果他的父进程没有对 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   
终止进程快捷键的区别 -- 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    #技术分享   
一、加锁以及防止程序意外崩溃每台机器上布2个 schedule 进程,在rabbitmq中放一个任务键值,两个进程哪个取到这个键即进行后续工作,另一个处于等待状态当工作处理完毕,重新插入该键值,如果插入失败,直接退出,插入成功则ack 二、集群控制及调度周期控制在缓存中建立 id => schedule_time 的对应关系,每次获取当前时间以前的所有ID,然后进入第三步,处理结束后,zadd,如果调度程序中途退出,可以保证该id被调度 三、减轻MYSQL压力以及防止缓存意外崩溃将数据库中字段组成xml存入缓存,调度程序如果在缓存中没有查到ID(缓存意外崩溃),那么到数据库中差找字段插入缓存,否则直接从缓存读取一个守护进程定时同步数据库与缓存之间的数据 
#技术帖    #技术分享    #work    #工作   
问题/* * file: main.c * author: 龙泉居士 * date: 2012-12-22 05:23 */ #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUMBER_OF_THREADS 10 void *print_hello_world (void *tid) { printf ("Hello World from thread %d\n", tid); pthread_exit (NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUMBER_OF_THREADS]; int status, i; for (i=0; i<NUMBER_OF_THREADS; ++i) { printf ("Main Hear, Creating thread %d\n", i); status = pthread_create (&threads[i], NULL, print_hello_world, (void *)i); if (sta
#技术帖    #linux    #unix    #c语言   
问题C++ programming language 第309页的例子:template <class C> class Basic_ops //基本操作类 { public: bool operator== (const C&) const; bool operator!= (const C&) const; // ... const C& derived () const //获得操作访问权 { return static_cast <const C&> (*this); } }; template <class T> class Math_container : public Basic_ops < Math_container<T> > //具体实现的容器类 { public: size_t size() const; T& operator[] (size_t); const T& operator[] (size_t) const; // ... }; 这样,使得有关容器的基本操作定义可以与容器本身的定义分开,而且只需定义一次&n
#读书笔记    #技术帖    #c++    #cpp   
问题难道在栈上也可以动态开辟数组了/* * file: main.c * author: 龙泉居士 * date: 2012-11-20 06:12 */ #include <stdio.h> int main () { int n; scanf ("%d", &n); int a[n], i; for (i=0; i!=n; ++i) { int x; scanf ("%d", &x); a[i] = x; } for (i=0; i!=n; ++i) printf ("%d ", a[i]); printf ("\n"); return 0; } 无聊中写了一个程序居然编译通过运行正常,这这这。。。什么状况。。。整个三观都颠覆了,这样的程序不应该可以编译通过啊,难道在栈上也可以动态开辟数组? 解答Variable-length array,在这里有叙述: For example, the GNU C Compiler allocates 
#技术帖    #linux    #unix    #技术分享   
问题在C++ programming language一书的第九章中描述了C++的单一定义规则,ODR,根据这一规则,“一个inline函数必须在需要用他的每个编译单位里通过完全一样的定义来定义”并且举了例子:file1.c:inline int f(int i) { return i; } file2.c:inline int f(int i) {return i+1;} 书中说这个例子是非法的,因为在两个编译单位中的定义不完全相同那么,下面是我写的一个代码,也是我的问题:我的程序分为main.cc、func.cc和function.h三个文件,main.cc和func.cc中定义了两个如上面反例所写的同名inline函数,他们的函数体并不相同,function.h中是这个inline函数的声明:/* * file: main.cc * author: 龙泉居士 * date: 2012-10-17 04:37 */ #include <iostream> #include "function.h" using namespace std; int main () { f(3); return 0; } inline void f (int a) { cout <<
#读书笔记    #技术帖    #c++    #cpp   
问题fork调用只会复制调用线程,既然fork复制父进程地址空间中的全部内容,为什么只复制调用线程?难道线程不在进程的地址空间中吗? 解答:进程的地址空间主要是指内存的部分,而是否只复制调用线程,这是操作系统决定的特性 
#技术帖    #unix    #技术分享    #线程   
问题一发现在CGI中父进程和子进程不能同时读写,为什么会这样,在父进程完全不读写的情况下子进程读写没有问题 问题二这个问题因为另一个问题的启发,冥冥之中觉得应该可以解决,只是现在学识的不足,没有什么想法,另一个问题就是:#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main () { printf ("please input the loop time:\n"); int t, i; scanf ("%d", &t); FILE *f; f = fopen("forkfile", "a"); for (i=0; i!=t; ++i) { fork(); fprintf (f, "-"); printf ("-"); } fclose(f); return 0; }  为了及时地释放资源,于是改了一下,改成了下面这样:#include <stdio.h> #incl
#技术帖    #c语言    #进程    #fork   
引言今天一个同学问我结构体怎么用,他说之前可以运行的代码突然不能运行了,说编译器报的错是“undeclared”,但是明明在h文件中定义了这个结构体大体上代码是这样的://main.h struct Node { int value; Node *next; }; //main.c Node *n = (Node *)malloc(sizeof(Node)); 看上去并没有问题,可是编译器确实报了undeclared错,这是为什么呢?下面就三个问题说一下 结构体C语言中,结构体是一个非常常用的基本的语言特性,其优势在于,将数据进行封装,但是C语言中的结构体和C++中的struct是有着本质区别的,C++中的struct并不是传统意义上的结构体,而是默认为public的类,C语言中的struct中是绝对不允许有函数的,但是在C++中的struct是可以的,这是因为在C++中,struct并不是指结构体,只是默认为public的class,因此在显式声明类访问权限的例子中,struct和class是完全没有任何区别的,这也就是为什么在.cc的工程中可以使用的struct的定义和使用方法在.c的工程中却不行,因为C语言中的struct和C++中的struct根本就是两种完全不同的东西,只是有的时候可以做相同的事而已,两者本质上
#技术帖    #c语言    #结构体    #技术分享   



京ICP备15018585号