在LInux下怎么样进行父子进程同步

在LInux下怎么样进行父子进程同步,第1张

/*

* 使用信号实现父子进程之间的同步

*

* 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博客

大家还在搜

子进程和父进程的理解

父进程和子进程哪些是共享的

父子进程可以同名吗

关于子进程和父进程的说法

用户级线程有没有线程控制块

一个进程可以没有父进程

以下关于父进程和子进程的叙述中

子进程会继承父进程的哪些内容

下一页

父进程在什么情况下可以相同

百度


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8382041.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-15
下一篇2023-04-15

发表评论

登录后才能评论

评论列表(0条)

    保存