背景说明:
        后台子系统都是运行在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. 第三篇——第二部分——第一文 SQL Server镜像简单介绍

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/DBA_Huangzj/article/details/26951563 原文出处:http://bl ...

  2. mybatis实现最简单的增删改查

    1.数据库设计 2.项目结构(针对User不用管Blogger) User.java package com.yunqing.mybatis.bean; public class User { pri ...

  3. [转]C#打造一个开源webgis(一)系统架构

    搭建一个GIS系统,为了能同时适应C/S和B/S架构,建议是做成自己的地图服务api方式,这样,一个或多个系统,就能通过统一的地图服务接口提供,而通信可以采用http的resful方式,而一个webG ...

  4. sqlserver事务怎么开启 怎么提交 怎么回滚

    1.自动transaction每句statement都是一个transaction.例一个update指令更新多笔纪录, 要就全部成功, 只要失败,全部会回复原值. 2.ExplicitTransac ...

  5. HDU 2036 改革春风吹满地 (求多边形面积)

    传送门: 改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  6. HTML5学习总结——相关练习与项目

    一.小米商城项目 第一天示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  7. H5基本标签

  8. linux下安装使用tar

    安装tar,untar: yum install -y tar yum install -y untar 使用说明: 压缩 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip ...

  9. OpenID Connect Core 1.0(三)验证

    OpenID Connect执行终端用户登录或确定终端用户已经登录的验证工作.OpenID Connect 使服务器以一种安全的方式返回验证结果.所以客户可以依靠它.出于这个原因,在这种情况下客户被称 ...

  10. MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询

    支持的 JDBC 类型为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 JDBC 类型. BITFLOATCHARTIMESTAMPOTHERUNDEFINEDTINY ...