可以用信号实现父、子进程之间的同步
来源:互联网 发布:诸暨市淘宝司法拍卖 编辑:程序博客网 时间:2024/05/19 03:25
可以用信号实现父、子进程之间的同步,这是信号应用的另一个实例。
程序清单10-17包含了8.9节提到的五个例程的实现,它们是:TELL_WAIT、TELL_PARENT、TELL_CHILD、WAIT_PARENT和WAIT_CHILD。
《UNIX环境高级编程》P272:程序清单10-17 父子进程可用来实现同步的例程(有改动)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
static
volatile
sig_atomic_t
sigflag;
static
sigset_t newmask, oldmask, zeromask;
static
void
sig_usr(
int
signo)
{
sigflag = 1;
}
void
TELL_WAIT(
void
)
{
if
(
signal
(SIGUSR1, sig_usr) == SIG_ERR)
fprintf
(stderr,
"signal(SIGUSR1) error\n"
);
if
(
signal
(SIGUSR2, sig_usr) == SIG_ERR)
fprintf
(stderr,
"signal(SIGUSR2) error\n"
);
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGUSR2);
// 添加 SIGUSR1 和 SIGUSR2,保存当前信号屏蔽字
if
(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
fprintf
(stderr,
"SIG_BLOCK error\n"
);
}
void
TELL_PARENT(pid_t pid)
{
kill(pid, SIGUSR2);
// 通知父进程,准备完毕
}
void
WAIT_PARENT(
void
)
{
while
(sigflag == 0)
sigsuspend(&zeromask);
// 等待父进程
sigflag = 0;
// 恢复原来的信号屏蔽字
if
(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
fprintf
(stderr,
"SIG_STEMASK error\n"
);
}
void
TELL_CHILD(pid_t pid)
{
kill(pid, SIGUSR1);
// 通知子进程,准备完毕
}
void
WAIT_CHILD(
void
)
{
while
(sigflag == 0)
sigsuspend(&zeromask);
// 等待子进程
sigflag = 0;
// 恢复原来的信号屏蔽字
if
(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
fprintf
(stderr,
"SIG_SETMASK error\n"
);
}
其中使用了两个用户定义的信号:SIGUSR1由父进程发送给子进程,SIGUSR2由子进程发送给父进程。
0 0
- 可以用信号实现父、子进程之间的同步
- 信号实现父子进程之间的同步--sigsuspend的作用
- 信号实现父子进程之间的同步--sigsuspend的作用
- 信号实现父子进程之间的同步--sigsuspend的作用
- 使用信号signal,实现进程之间的同步
- 用信号实现进程同步
- 子进程是可以继承父进程的信号处理的
- 信号实现父子进程同步
- 进程同步--信号实现--APUE
- 子进程在复制父进程的信号处理方式
- 父进程与子进程间的信号通信
- 子进程在复制父进程的信号处理方式
- 信号实现父子进程间同步
- UNIX环境高级编程学习之第十章信号-用信号实现父子进程同步
- 进程之间的同步方式
- 进程之间的同步机制
- 父、子进程同步的5个例程的两种实现方式
- 父进程,子进程,线程之间的关系
- 线性回归
- C# 显示过去了多长时间的函数
- 用摊还分析来解决计算成本:Effective c++
- BASIS模块-后台配置的传输
- 单例延迟加载模式
- 可以用信号实现父、子进程之间的同步
- Ubuntu14.04安装ssh服务
- UVALive - 4487 Exclusive-OR 加权并查集
- java内存管理深入浅出
- Android逆向工程
- 编译原理-DFA有穷自动机 词法分析应用于O(n)的单词匹配
- 判断从2到输入数字间的数字是否为素数
- hdoj 2098 分拆素数和
- junit的安装和测试原则