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

2017-05-12 17:37:42 +08:00
 icedx

如何理解这段代码

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

2146 次点击
所在节点    问与答
21 条回复
icedx
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
2017-05-12 17:42:25 +08:00
创建新进程又有两次返回。你去搜索一下 fork().给你个链接: http://t.cn/Raa4biZ
am241
2017-05-12 17:47:11 +08:00
测试 fork 功能??

看名字没准是遇到过什么神奇的 bug
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
2017-05-12 17:56:17 +08:00
if (pid = fork()) 等效于
pid = fork()
if (pid)

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

老司机,带带我啊。
rrfeng
2017-05-12 21:28:14 +08:00
C 表达式是有值的!
icedx
2017-05-12 23:18:39 +08:00
@Kilerd
和这个是一个东西
我还在研究
https://www.v2ex.com/t/358157#reply36
icedx
2017-05-12 23:19:42 +08:00
@kmahyyg 略懂一点
icedx
2017-05-12 23:20:48 +08:00
@rrfeng
这个看到过 但是印象不深
印象深的是那个
经常把 i==0 写成 0==i
为了防止 出现 i=0 这种错误
Kilerd
2017-05-13 00:37:26 +08:00
@icedx 那么恐怖吗? 直接看那么底层的东西了。
ryd994
2017-05-13 03:53:33 +08:00
@icedx #15 那是老黄历了。0==i 人看起来都不自然。再说编译器有警告。还是代码清晰更重要。
#13 建议你不要搞这种事情,回头人家手机无端被 root 了泄露资料了是你的责任。
icedx
2017-05-13 10:09:38 +08:00
@Kilerd
一开始确实是很简单的 但是后来我发现 定时调小系统媒体声音的话导航的声音也会定时变小
所以我得知道现在有没有在导航
所以现在越来越复杂
Kilerd
2017-05-13 10:14:14 +08:00
@icedx 然后发现进入了一个炒鸡大坑。
raiz
2017-05-13 17:23:23 +08:00
没错。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360930

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX