首页 > 系统相关 >进程间通信-socketpair

进程间通信-socketpair

时间:2022-12-15 18:36:29浏览次数:38  
标签:int sv sync 间通信 EXIT syncfd 进程 include socketpair

最近在看libcontainer中nsexec.c的实现,看到init进程的parent与child、grandchild之间的双工通信使用了socketpair。socketpair的使用与fifo类似,在不具名的情况下可以实现父子进程间简单的信息交换。

系统调用

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sv[2]);

使用示例

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdbool.h>
#include <sys/wait.h>

#define ERR_EXIT(msg) \
do{ \
perror(msg); \
exit(EXIT_FAILURE); \
}while(0)

enum sync_t {
PARENT_ACK = 0x41,
CHILD_ACK = 0x43,
};
int main(){
int sv[2];
if(socketpair(AF_LOCAL,SOCK_STREAM,0,sv) == -1){
ERR_EXIT("open socket pair error.");
}
pid_t cpid;
cpid = fork();
if(cpid == -1){
ERR_EXIT("fork child error.");
}
int syncfd;
if(cpid == 0){
syncfd = sv[1];
if(close(sv[0] < 0))
ERR_EXIT("child close useless fd error.");
bool complete = false;
while(!complete){
enum sync_t s;
read(syncfd,&s,sizeof(s));
if(s == PARENT_ACK){
s = CHILD_ACK;
write(syncfd,&s,sizeof(s));
complete = true;
}
}
printf("child sync finish.\n");
exit(EXIT_SUCCESS);
}else{
syncfd = sv[0];
if(close(sv[1] < 0)){
ERR_EXIT("parent close useless fd error.");
}
bool complete = false;
enum sync_t s;
s = PARENT_ACK;
write(syncfd,&s,sizeof(s));
while(!complete){
enum sync_t s;
read(syncfd,&s,sizeof(s));
if(s == CHILD_ACK){
complete = true;
}
}
printf("parent sync finish.\n");
waitpid(cpid,NULL,0);
}

exit(EXIT_SUCCESS);
}

标签:int,sv,sync,间通信,EXIT,syncfd,进程,include,socketpair
From: https://blog.51cto.com/u_15913033/5945628

相关文章

  • Supervisor 进程管理
    ##一、简介supervisor是一个Python开发的、通用的进程管理程序。当程序中断时,supervisor能自动重启它,不再需要程序员或系统管理员自己编写代码来控制。**supervisor要求......
  • 【Python多任务--进程,协程】
    一、进程进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程是线程的容器,一个进程可以有多个线程进程特......
  • 【Python多任务--进程池Pool】
    进程池Pool在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用multiprocess......
  • 【JUC】进程和线程
    目录一、进程1、概述2、进程和线程3、并发与并行4、同步与异步5、新线程的创建5.1使用Thread5.2使用Runnable配合Thread5.3FutureTask配合Thread6、自定义线程类的创建6......
  • 获取当前窗口的进程名 - 软件
    获取当前窗口的进程名---------------------------------------------生活的意义并不是与他人争高下,而在于享受努力实现目标的过程,结果是对自己行动的嘉奖。↑面的话......
  • 【分享一个工具】通过定义proto3来自动生成多进程模式的插件代码
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯我在多进程插件框架hashicorp/go-plugin的基础上,使用pro......
  • ogg目标库应用进程异常,告警OGG-00519、ORA-02443
    问题描述:ogg目标库应用进程异常,告警OGG-00519、ORA-02443,如下所示:场景说明:源端表中存在一个约束,约束名为系统自定义,该约束在目标端未能查找,所以便在源库将其删除,结果就出现......
  • ogg在启动应用进程时报错OGG-00412
    问题描述:ogg在启动应用进程时报错OGG-00412,如下所示:源端:IP192.168.133.108数据库oracle10.2.0.464位,实例名:orcl主机名:leo-10g-ogg+oel5.1164位目标端:IP192.......
  • 进程线程
    1、什么是进程、线程、并发、并行一、进程线程1、进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需......
  • 操作系统-进程、线程、死锁、管程
    2.1进程定义:由程序段、数据段、PCB三部分组成了进程实体(进程映像)PCB是进程存在的唯一标志,所谓创建、撤销进程即是创建、撤销进程实体中的PCB进程是进程实体的运行......