如何理解这段代码
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
1
icedx OP 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; } } |
2
luchenqun 2017-05-12 17:42:25 +08:00
创建新进程又有两次返回。你去搜索一下 fork().给你个链接: http://t.cn/Raa4biZ
|
3
am241 2017-05-12 17:47:11 +08:00 via Android
测试 fork 功能??
看名字没准是遇到过什么神奇的 bug |
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; } } |
5
ryd994 2017-05-12 17:56:17 +08:00 via Android
if (pid = fork()) 等效于
pid = fork() if (pid) 老手这么玩的多了 实际上因为容易导致读者误解,一般不建议,或者至少双层括号,否则编译器会 warning |
6
mdzz 2017-05-12 18:00:12 +08:00
blame 一下就是这个函数对应的 commit
https://github.com/CyanogenMod/Superuser/commit/5f2c65812cfedec33118bb1fd7fa7d7367246f9a |
8
ryd994 2017-05-12 18:02:02 +08:00 via Android 1
这段代码是为了创建后台进程
父进程退出后,子进程会由 init 收养 这里两层 fork,父进程大概是一直跑的不能退出,所以只能加一层子进程,子进程 fork 出孙进程就离开退出。这样孙进程就成孤儿了。 不过这里孙进程 exit0 不懂什么意义,理解退出一点用都没有 |
9
kmahyyg 2017-05-12 18:37:54 +08:00 via Android
cm......
|
11
Kilerd 2017-05-12 21:15:57 +08:00
厉害了,都开始搞这个东西了。
老司机,带带我啊。 |
12
rrfeng 2017-05-12 21:28:14 +08:00
C 表达式是有值的!
|
13
icedx OP |
17
ryd994 2017-05-13 03:53:33 +08:00 via Android
@icedx #15 那是老黄历了。0==i 人看起来都不自然。再说编译器有警告。还是代码清晰更重要。
#13 建议你不要搞这种事情,回头人家手机无端被 root 了泄露资料了是你的责任。 |
18
icedx OP |
20
raiz 2017-05-13 17:23:23 +08:00
没错。。
|