Linux进程通信
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-01
不外乎: 1. 信号; 2. 管道; (System V IPC->)3. 消息队列; 4. 信号量; 5. 共享内存; 网络程序设计中通常包括两个或更多的需要互相对话的进程,因此进程通信的方法在网络程序设计中 是极为重要的. 网络程序设计的一个重要目标是保证进程间不互相干涉,否则系统可能被挂起或自锁,因此,进程间 使用简洁有效地方法进行通信. 管道, 队列. 1. 进程阻塞, 共享资源, 锁定. 2. 信号: 用它来通知一个或多个进程异步事件的发生,比如键盘上某个键按下. 处理某种严重的错误. 2.1 可用 kill 把SIGTERM 信号发送给这个进程. 2.2 信号可以中断一个进程. 2.3 bits/signum.h 对某些特定的信号名作了定义. 2.4 P57 "SIGUP" "SIGINT" "SIGQUIT" "SIGILL" "SIGTRAP" "SIGFPE" "SIGTERM"-终止进程 "SIGCHILD"--实现exit和wait. 2.5 void abort(void); -- stdlib.h 3. 信号的处理 [unix系统调用signal()用于接收一个指定类型的信号,并可以指定相应的方法.] int signal(int sig, __sighandler_t handler); 1. func 2. SIG_IGN SIG_DFL 4. 在进程间发送信号 int kill(pid_t pid, int sig); --一般用于父子进程之间 if(pid==0), 则信号被发送到当前进程所在的进程组的所有进程; -1, 则信号进程标识符从高到低的顺序发送给全部的进程(搜,当前进程本身权限的限制). <-1, 则信号被发送给标识符为pid绝对值的进程组里的所有进程. kill 默认信号为: SIGTERM. kill -s SIGINT 1234 5. 系统调用 alarm() 和 pause() 5.1 unsigned int alarm(unsigned int secondes)-- unistd.h alarm(60); -- 60s后发送SIGALRM信号 alarm(0);--使报警时钟失效. 当需要对某些工作设置时间限制时 5.2 pause()能使调用进程暂停执行,直至接收到某种信号为止. int pause(void);-- unistd.h 6. 系统调用setjmp() 和 longjmp() 有时候,当接收到一个信号时,希望能跳回程序中以前的一个位置执行. setjmp(), 保存程序中的当前位置(是通过保存堆栈环境实现的). longjmp(), 能把控制转会被保存的位置. int setjmp(jmp_buf env); --<setjmp.h void longjmp(jmp_buf env, int val); 3. 管道, 就是将一个程序的输出和另外一个程序的输入连接起来的"单向通道".--shell[P71] #ls -l|more ----> 流向 在Linux系统内核里, 每个管道都是用一个inode节点来表示的.(当然,你是不会看到这个节点的,它 只存在于系统的内核中.) 管道的I/O处理. 父子两个进程同时拥有对同一个管道的读写句柄.管道 是单向的(它没有提供锁定的保护机制),我们决定数据的流动方向(从父到资,还是从 子到父?), 然后在每个进程中关闭不需要的句柄. pipe(), dup(), dup2(), popen()/pclose() popen("ls ~roy", "r"); popen("sort > /tmp/zixia","w"); 1. pipe()的调用在fork()之前; 2. 及时关闭不需要的管道句柄; 3. 使用dup()之前确定定向的目标是最小的文件句柄; 4. 管道只能实现父子进程间的通信,如果两个 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Linux进程通信的所有评论