V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
icedx
V2EX  ›  问与答

求个 Linux C 开发的大手子来请教一个问题

  •  
  •   icedx · 2017-05-12 17:37:42 +08:00 · 2134 次点击
    这是一个创建于 2756 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如何理解这段代码

    int fork_zero_fucks() { int pid = fork(); if (pid) { int status; waitpid(pid, &status, 0); return pid; } else { if (pid = fork()) exit(0); return 0; } }

    代码来自 https://github.com/CyanogenMod/Superuser/blob/cm-12.0/Superuser/jni/su/su.c

    if (pid = fork()) 这个是写错了么? 如果没写错是啥意思

    先谢谢了 0 0

    21 条回复    2017-05-14 17:47:04 +08:00
    icedx
        1
    icedx  
    OP
       2017-05-12 17:38:40 +08:00
    int fork_zero_fucks() {
    int pid = fork();
    if (pid) {
    int status;
    waitpid(pid, &status, 0);
    return pid;
    }
    else {
    if (pid = fork())
    exit(0);
    return 0;
    }
    }
    luchenqun
        2
    luchenqun  
       2017-05-12 17:42:25 +08:00
    创建新进程又有两次返回。你去搜索一下 fork().给你个链接: http://t.cn/Raa4biZ
    am241
        3
    am241  
       2017-05-12 17:47:11 +08:00 via Android
    测试 fork 功能??

    看名字没准是遇到过什么神奇的 bug
    neighbads
        4
    neighbads  
       2017-05-12 17:53:48 +08:00
    fork() 父进程返回子进程 pid 子进程返回 0 失败返回-1

    int fork_zero_fucks() {
    int pid = fork();
    if (pid) {
    //父进程
    int status;
    waitpid(pid, &status, 0);
    return pid;
    }
    else {
    //儿子进程
    if ((pid = fork()))
    {
    //儿子进程退了
    exit(0);
    }
    //孙子进程返回
    return 0;
    }
    }
    ryd994
        5
    ryd994  
       2017-05-12 17:56:17 +08:00 via Android
    if (pid = fork()) 等效于
    pid = fork()
    if (pid)

    老手这么玩的多了
    实际上因为容易导致读者误解,一般不建议,或者至少双层括号,否则编译器会 warning
    mdzz
        6
    mdzz  
       2017-05-12 18:00:12 +08:00
    icedx
        7
    icedx  
    OP
       2017-05-12 18:00:23 +08:00
    @ryd994
    谢谢
    确实是 Build 的时候报 Warning 了
    而且我也理解不了他为啥这么写
    现在明白了 w
    ryd994
        8
    ryd994  
       2017-05-12 18:02:02 +08:00 via Android   ❤️ 1
    这段代码是为了创建后台进程
    父进程退出后,子进程会由 init 收养
    这里两层 fork,父进程大概是一直跑的不能退出,所以只能加一层子进程,子进程 fork 出孙进程就离开退出。这样孙进程就成孤儿了。
    不过这里孙进程 exit0 不懂什么意义,理解退出一点用都没有
    kmahyyg
        9
    kmahyyg  
       2017-05-12 18:37:54 +08:00 via Android
    cm......
    kmahyyg
        10
    kmahyyg  
       2017-05-12 18:38:32 +08:00 via Android
    @icedx 兄弟搞 android rom 的?
    Kilerd
        11
    Kilerd  
       2017-05-12 21:15:57 +08:00
    厉害了,都开始搞这个东西了。

    老司机,带带我啊。
    rrfeng
        12
    rrfeng  
       2017-05-12 21:28:14 +08:00
    C 表达式是有值的!
    icedx
        13
    icedx  
    OP
       2017-05-12 23:18:39 +08:00
    @Kilerd
    和这个是一个东西
    我还在研究
    https://www.v2ex.com/t/358157#reply36
    icedx
        14
    icedx  
    OP
       2017-05-12 23:19:42 +08:00
    @kmahyyg 略懂一点
    icedx
        15
    icedx  
    OP
       2017-05-12 23:20:48 +08:00
    @rrfeng
    这个看到过 但是印象不深
    印象深的是那个
    经常把 i==0 写成 0==i
    为了防止 出现 i=0 这种错误
    Kilerd
        16
    Kilerd  
       2017-05-13 00:37:26 +08:00
    @icedx 那么恐怖吗? 直接看那么底层的东西了。
    ryd994
        17
    ryd994  
       2017-05-13 03:53:33 +08:00 via Android
    @icedx #15 那是老黄历了。0==i 人看起来都不自然。再说编译器有警告。还是代码清晰更重要。
    #13 建议你不要搞这种事情,回头人家手机无端被 root 了泄露资料了是你的责任。
    icedx
        18
    icedx  
    OP
       2017-05-13 10:09:38 +08:00
    @Kilerd
    一开始确实是很简单的 但是后来我发现 定时调小系统媒体声音的话导航的声音也会定时变小
    所以我得知道现在有没有在导航
    所以现在越来越复杂
    Kilerd
        19
    Kilerd  
       2017-05-13 10:14:14 +08:00
    @icedx 然后发现进入了一个炒鸡大坑。
    raiz
        20
    raiz  
       2017-05-13 17:23:23 +08:00
    没错。。
    icedx
        21
    icedx  
    OP
       2017-05-14 17:47:04 +08:00
    @Kilerd 是的 出不来了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 11:34 · PVG 19:34 · LAX 03:34 · JFK 06:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.