不外乎: 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. 管道只能实现父子进程间的通信,如果两个 |