背景说明:
        后台子系统都是运行在pc上的linux
        系统有多个子系统,有一个子系统负责统一启停其他子系统,这里把这个子系统称为olddriver。
        olddriver子系统在每个子系统的所有主机上都有一个用户及相应的客户端进程。
        平时各子系统各自为阵,自行在主机shell命令行进行启停。图示如下:
 
                           

      上线前,在olddriver上把所有的子系统部署,配置做完,上线当晚使用olddriver启动子系统A,发现启不来。进一步追查是IPC无法创建。由于输出日志有限,不能进一步定位。
      当时我猜想是不是因为olddriver client使用exec启动子系统A的进程时缺乏创建IPC的权限,于是想起一个解决办法“设置用户ID”。
       
                   进程的权限是和进程的有效用户ID相关,通常情况下exec函数执行时将父进程的有效用户ID拷贝过来设置子进程的有效用户ID,
                   但是如果子进程的可执行文件设置了设置用户ID时(chmod +s),exec将会使用设置用户ID来作为子进程的有效用户ID
 
      所以不管你是哪个用户下的什么进程通过exec来执行这个可执行文件时,产生的子进程都相当于是在可执行文件归属用户下启动一样,就不会存在权限问题。我把这个想法给相关领导说了一下,没有被采用,因为领导考虑上线时间控制更加重要,所以像平时一样在shell命令行直接启动了。  
 
      有没有被坑的感觉,大家!还没完...
 
      系统顺利上线了,之后的某一天,负责子系统A的同学获得了一次gdb的机会,还是由olddriver来启动的场景。于是终于定位到了问题。
 
      代码居然使用了errno来作为流程控制伪代码大概是这样

 init(); //这里errno会变为2
fprintf(stdout,"xxxx",...);
if(errno==)
{
createIPC();
}
   
     gdb的时候发现在init()后,errno==2 但是fprintf()以后errno变成了25
      errno.25 is: Inappropriate ioctl for device
    
     我在/proc/该进程的进程号/目录下执行了 ls -l命令,发现标准输出连接到了/dev/null。
     问题定位了,olddriver在启动子进程的时候把标准输出重定向了,所以fprintf()报错设置了errno,导致流程跳过了IPC的创建;由于平时在shell命令行启动时,并没有重定向标准输出,所以没有发现这个问题
     所以,遇到问题想办法精确定位问题才是正确之选,猜测不靠谱啊。

一次IPC无法创建的问题的更多相关文章

  1. 第3章 System V IPC

    3.1 概述 System V IPC 包含:System V消息队列.System V信号量.System V共享内存. 3.2 key_t 键和 ftok函数 这三种类型的System V IPC ...

  2. 《Unix网络编程》卷2 读书笔记 第2章- Posix IPC

    1. 概述 Posix IPC 包括:Posix消息队列.Posix信号量.Posix共享内存区 Posix IPC在访问它们的函数和描述它们的信息上有一些类似点. 本章讲述所有这些共同属性:用于标识 ...

  3. UNIX环境高级编程——IPC总结

    IPC主要包括:管道,消息队列,信号量,共享内存, 套接字(SOCKET). 一.IPC对象的持久性 每种IPC机制都会借助一种数据结构,这种数据结构的实例称为该IPC机制的对象(相应的,用于同步互斥 ...

  4. (转)Hadoop系列-IPC模型

    学习笔记Mark IPC 实现RPC的一种方法,具有快速.简单的特点. 它不像Sun公司提供的标准RPC包,基于Java序列化. IPC无需创建网络stubs和skeletons. IPC中的方法调用 ...

  5. IPC Gateway 设计

    1. IPC Gateway对外提供的功能: IPC的register/request/reply/notification服务. 2. IPC Gatew的实现原理: 各个具体的服务注册自己的回调函 ...

  6. UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

     IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对 ...

  7. 进程间通信(IPC)-管道、匿名管道

    每个进程都有各自的地址空间,任何一个进程的全局变量在另一个进程中都看不到 所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读 ...

  8. PCB的IPC标准是什么

    PCB的IPC标准是什么 印刷电路研究所成立于1957年,有6家印刷电路板制造商.1977年,许多电子公司与工控机联合起来,以实现电子电路的互连和封装.1998年,IPC协会创建了一个"连接 ...

  9. Docker之Linux Namespace

    Linux Namespace 介绍 我们经常听到说Docker 是一个使用了Linux Namespace 和 Cgroups 的虚拟化工具,但是什么是Linux Namespace 它在Docke ...

随机推荐

  1. react 开发中的问题简记

    1.什么时候用props 什么时候用state ? 不能使用props:当页面组件存在URL跳转问题时候,原因:若单独刷新,他会报错,拿不到前面的数据: 使用props场景:当组件为页面组件的一部分即 ...

  2. 优秀的WEB前端开发框架:Bootstrap!

    其实早就对Bootstrap有所耳闻,大概了解这哥们是做WEB前端的 但直到昨天以前,还没有对他产生任何深入了解的兴趣 冷落他的主要原因还是觉得会束缚手脚,毕竟自己多年来在WEB前端的积累一直没有停滞 ...

  3. 理解基本包装类型Number,String,Boolean

    在前面我们知道了引用类型是什么了,也就能理解包装类型了.包装对象其实也是一种引用类型,之所以要单独提出来只不过是因为它们可以把原始类型的值变成(包装成)对象,这样它们也就获得了各自类型相应的特殊行为了 ...

  4. IP黑白名单

    防攻击可以增加IP白名单/etc/hosts.allow和黑名单/etc/hosts.deny /etc/hosts.allow  IP白名单 /etc/hosts.deny   IP黑名单 /etc ...

  5. 使用jmeter进行简单的压测

    安装下载 前往官网下载,[地址] 环境 需要java环境,此处略 最好对jmeter配置下环境变量,方便打开,此处略 运行 启动jmeter 进入到bin目录,输入   ./jmeter    启动 ...

  6. 使用命令导入、导出mysql数据

    1.导出全部数据库 利用mysqldump的—all-databases参数可以一口气把你数据库root用户下的所有数据库一口气导出到一个sql文件里.然后,重装系统后使用source命令可以再一口气 ...

  7. 如果将自己的项目共享到github上

    1:创建仓库 点击New repository创建仓库.Git上仓库就相当于项目的意思 创建仓库名(repository) 创建成功后得到自己的github地址 2:在eclipse中创建自己的项目 ...

  8. 如果有人问你CAP理论是什么,就把这篇文章发给他。

    绝对和你在网上看到的CAP定理介绍不一样. CAP 定理(CAP theorem)又被称作布鲁尔定理(Brewer's theorem),是加州大学伯克利分校的计算机科学家埃里克·布鲁尔(Eric B ...

  9. Swift:一个基于.NET Core的分布式批处理框架

    Swift是什么 从文章的标题可知:此Swift非Apple那个Swift,只是考虑这个词的含义比较适合. Swift是一个基于.NET Core的分布式批处理框架,支持将作业分割后分发到多台服务器并 ...

  10. Oracle作业3 —— 简单查询

    一.创建学生表 CREATE TABLE STUDENTS( STU_ID ) CONSTRAINTS PK_STUS_ID PRIMARY KEY, STU_NAME ) NOT NULL, STU ...