
*
* TELL_WAIT(): set things up for TELL_xxx &WAIT_xxx
* TELL_PARENT(): tell parent we are done
* WAIT_PARENT(): wait for parent
* TELL_CHILD(): tell child we are done
* WAIT_CHILD(): wait for child
*
* SIGUSR1: the signal parent sends to child
* SIGUSR2: the signal child sends to parent
*/
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
static volatile sig_atomic_t sigflag
static sigset_t newmask, oldmask, zeromask
/* signal handler for SIGUSR1 and SIGUSR2 */
static void sig_usr(int signo)
{
sigflag = 1
return
}
void TELL_WAIT()
{
if(signal(SIGUSR1, sig_usr) == SIG_ERR)
printf("signal SIGUSR1 error\n")
if(signal(SIGUSR2, sig_usr) == SIG_ERR)
printf("signal SIGUSR2 error\n")
sigemptyset(&zeromask)
sigemptyset(&newmask)
sigaddset(&newmask, SIGUSR1)
sigaddset(&newmask, SIGUSR2)
/* block SIGUSR1 and SIGUSR2, and save current signal mask */
if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) <0)
printf("SIG_BLOCK error\n")
}
void TELL_PARENT(pid_t pid)
{
kill(pid, SIGUSR2)/* tell parent we are done */
}
void WAIT_PARENT()
{
while(sigflag == 0)
sigsuspend(&zeromask)/* wait for parent */
sigflag = 0
/* reset signal mask */
if(sigprocmask(SIG_SETMASK, &oldmask, NULL) <0)
printf("SIG_SETMASK error\n")
}
void TELL_CHILD(pid_t pid)
{
kill(pid, SIGUSR1)
}
void WAIT_CHILD()
{
while(sigflag == 0)
sigsuspend(&zeromask)/* wait for parent */
sigflag = 0
/* reset signal mask */
if(sigprocmask(SIG_SETMASK, &oldmask, NULL) <0)
printf("SIG_SETMASK error\n")
}
void do_task(char *task_str)
{
printf("%s\n", task_str)
}
/* parent goes first program */
int main()
{
pid_t pid
TELL_WAIT()
pid = fork()
if(pid <0) {
printf("fork error\n")
}
else if(pid == 0) {
WAIT_PARENT()
do_task("child task\n")
}
else {
do_task("parent task\n")
TELL_CHILD(pid)
}
return 0
}
/* child goes first program*/
int main()
{
pid_t pid
TELL_WAIT()
pid = fork()
if(pid <0) {
printf("fork error\n")
}
else if(pid == 0) {
do_task("child task\n")
TELL_PARENT(getppid())
}
else {
WAIT_CHILD()
do_task("parent task\n")
}
return 0
}
/*
* 使用管道实现父子进程同步
*
* 父进程在调用TELL_CHILD 时经由上一个管道写一个字符p,子进程在
* 调用TELL_PARENT时,经由下一个管道写一个字符c。相应的WAIT_XXX
* 函数调用read读一个字符,没有读到字符时阻塞(睡眠等待)。
*
*/
static int pfd1[2], pfd[2]
void TELL_WAIT()
{
if(pipe(pfd1) <0 || pipe(pfd2) <0)
printf("pipe error\n")
}
void TELL_PARENT(pid_t pid)
{
if(write(pfd2[1], "c", 1) != 1)
printf("write error\n")
}
void WAIT_PARENT()
{
char c
if(read(pfd1[0], &c, 1) != 1)
printf("read error\n")
if(c != 'p')
printf("WAIT_PARENT: incorrect data\n")
}
void TELL_CHILD(pid_t pid)
{
if(write(pfd1[1], "p", 1) != 1)
printf("write error\n")
}
void WAIT_CHILD()
{
char c
if(read(pfd1[0], &c, 1) != 1)
printf("read error\n")
if(c != 'c')
printf("WAIT_CHILD: incorrect data\n")
}
父进程在什么情况下可以相同Liunx *** 作 - Record14—父子进程中的相同与不同 - 恋蛩音的博客 - CSDN博客
2020年2月16日进程共享 fork后: 父子相同处 全局变量、data、.text、栈、堆、环境变量、用户ID、宿主...
CSDN博客
父子进程 - 龙宇在天 - 博客园
2020年12月18日不同处:1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集 父子进程相同处和不同处是在只读情况下成立,...
博客园
父子进程同步 - Fitz1318的博客 - CSDN博客 - 父进程和子进程是同步的
1. 如果子进程还未结束,父进程阻塞等待
2. 如果子进程已经结束,其终止状态字SIGCHILD放在指定位置等待父进程提取,这时,父进程可立即得到终止状态字并返回
3. 如果没有子进程,父进程立即错误返回。
CSDN博客
Linux8 - fork父子进程逻辑地址相同、进程的逻辑地址与物理地址、fork相...
1. 正常释放结束子进程: 1、进程实体已经被释放2、PID内部的exit_code = 0//进程的退出码,将PID内部的退出码置零3
2. 非正常流程、僵死状态:没有获取退出码
CSDN博客
大家还在搜
父进程和子进程共享虚拟地址空间
父进程与子进程之间的关系
父子进程共享
并发指的是什么
父进程和子进程相同和不同
父进程如何创建子进程
父进程和子进程具有相同的
父子进程可以并发执行
...变量地址相同——虚拟内存 - Ethan - Code的博客 - CSDN博客 - 父进程...
5月6日会完全复制父进程的栈空间,包括页表,但没有复制物理页面,所以这时虚拟地址相同,物理地...
CSDN博客
父进程在创建子进程之后,哪些东西共享,哪些东西不共享?
1. 父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量
2. 父、子进程各自执行不同的程序段。这种情况下,在fork之后,多宝父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符
CSDN博客
fork之后父子进程虚拟地址(逻辑地址)相同的问题 - 飞雪一刀的博客 - CS...
2014年11月7日可以看到,两个进程中实例的虚拟地址都是一样的,但是实际上指向的是两个不同的变量(物理地...
CSDN博客
父子进程folk后的相同点不同点以及进程共享知识点 - 一头特立独行的驴...
2020年11月11日父子进程之间在刚fork 后: 相同点:全局变量、.data、.text、栈、堆、环境变量、用户 ID、宿主目录、进程工作目录、信号处理方式… ...
CSDN博客
父子进程共享 - 一只小苹果的博客 - CSDN博客 - 父子进程共享
2020年12月3日父子进程不同(重点): 进程id 返回值 各自的父进程 进程创建的时间 闹钟 未决信号集 父子进程共享(重点): 1.文件描述符(fd) 2.mmap映射区...
CSDN博客
大家还在搜
子进程和父进程的理解
父进程和子进程哪些是共享的
父子进程可以同名吗
关于子进程和父进程的说法
用户级线程有没有线程控制块
一个进程可以没有父进程
以下关于父进程和子进程的叙述中
子进程会继承父进程的哪些内容
下一页
父进程在什么情况下可以相同
百度Liunx *** 作 - Record14—父子进程中的相同与不同 - 恋蛩音的博客 - CSDN博客
2020年2月16日进程共享 fork后: 父子相同处 全局变量、data、.text、栈、堆、环境变量、用户ID、宿主...
CSDN博客
父子进程 - 龙宇在天 - 博客园
2020年12月18日不同处:1.进程ID 2.fork返回值 3.父进程ID 4.进程运行时间 5.闹钟(定时器) 6.未决信号集 父子进程相同处和不同处是在只读情况下成立,...
博客园
父子进程同步 - Fitz1318的博客 - CSDN博客 - 父进程和子进程是同步的
1. 如果子进程还未结束,父进程阻塞等待
2. 如果子进程已经结束,其终止状态字SIGCHILD放在指定位置等待父进程提取,这时,父进程可立即得到终止状态字并返回
3. 如果没有子进程,父进程立即错误返回。
CSDN博客
Linux8 - fork父子进程逻辑地址相同、进程的逻辑地址与物理地址、fork相...
1. 正常释放结束子进程: 1、进程实体已经被释放2、PID内部的exit_code = 0//进程的退出码,将PID内部的退出码置零3
2. 非正常流程、僵死状态:没有获取退出码
CSDN博客
大家还在搜
父进程和子进程共享虚拟地址空间
父进程与子进程之间的关系
父子进程共享
并发指的是什么
父进程和子进程相同和不同
父进程如何创建子进程
父进程和子进程具有相同的
父子进程可以并发执行
...变量地址相同——虚拟内存 - Ethan - Code的博客 - CSDN博客 - 父进程...
5月6日会完全复制父进程的栈空间,包括页表,但没有复制物理页面,所以这时虚拟地址相同,物理地...
CSDN博客
父进程在创建子进程之后,哪些东西共享,哪些东西不共享?
1. 父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量
2. 父、子进程各自执行不同的程序段。这种情况下,在fork之后,多宝父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符
CSDN博客
fork之后父子进程虚拟地址(逻辑地址)相同的问题 - 飞雪一刀的博客 - CS...
2014年11月7日可以看到,两个进程中实例的虚拟地址都是一样的,但是实际上指向的是两个不同的变量(物理地...
CSDN博客
父子进程folk后的相同点不同点以及进程共享知识点 - 一头特立独行的驴...
2020年11月11日父子进程之间在刚fork 后: 相同点:全局变量、.data、.text、栈、堆、环境变量、用户 ID、宿主目录、进程工作目录、信号处理方式… ...
CSDN博客
父子进程共享 - 一只小苹果的博客 - CSDN博客 - 父子进程共享
2020年12月3日父子进程不同(重点): 进程id 返回值 各自的父进程 进程创建的时间 闹钟 未决信号集 父子进程共享(重点): 1.文件描述符(fd) 2.mmap映射区...
CSDN博客
大家还在搜
子进程和父进程的理解
父进程和子进程哪些是共享的
父子进程可以同名吗
关于子进程和父进程的说法
用户级线程有没有线程控制块
一个进程可以没有父进程
以下关于父进程和子进程的叙述中
子进程会继承父进程的哪些内容
下一页
父进程在什么情况下可以相同
百度
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)