一次偶然的测试中,发现su程序的BUG后,着手排查问题出自哪。
首先是简化代码作为测试。

int main(int argc, char *const argv[])
{pid_t pid = fork();if (!pid){execv("/bin/ping", argv);//exit(3);} else{int status =-1;waitpid(pid, &status, 0);  printf("pppp exit = %d \n", status);exit(status);}
}

通过上面的例子,发现了子进程返回值的问题。
1.使用shell测试ping失败时返回值为1,但是status的值却为512, 整个程序的返回值却是0
2.使用 exit(1) exit(2) exit(3) 取代execv却发现了返回值为 256 512 768 的规律,瞬间清醒了!!

再一次仔细看编程手册,所有编程法的真相都在官方文档,不要相信搜到的奇怪代码!!!
如下是对返回值的处理,英语好一切皆美好,苍天饶过谁!

If status is not NULL, wait() and waitpid() store status information in the int to which it points.
This integer can be inspected with the following macros
(which take the integer itself as an argument, not a pointer to it, as is done inwait() and waitpid()!):
WIFEXITED(status)
returns true if the child terminated normally, that is, by calling exit(3) or _exit(2), or by returning from main().
WIFSIGNALED(status)
returns true if the child process was terminated by a signal.

手册上还贴心的给出了示例代码,怪我眼瞎无视各种英文!

if (WIFEXITED(status)) {printf("exited, status=%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {printf("killed by signal %d\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {printf("stopped by signal %d\n", WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {printf("continued\n");
}

最后呢,改造一下这个程序。
这里我只会静静的等待程序运行完成,所以只需要WIFEXITED就结束了。

int main(int argc, char *const argv[])
{pid_t pid = fork();if (!pid){execv("/bin/ping", argv);} else{int status =-1;waitpid(pid, &status, 0);  if (WIFEXITED(status)) {exit(WEXITSTATUS(status));}exit(-1);}
}

关于waitpid的返回值问题相关推荐

  1. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  2. C语言 线程的回收与子线程返回值的接收

    穿的参数为二级指针 需要用全局变量来返回子线程的返回值 // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存 ...

  3. Linux 进程:进程退出返回值的获取

    目录 一.对输出参数status的理解 二.获取进程退出返回值 1.位运算 (1)异常退出码 (2)进程返回值 2.宏函数   我们常使用函数 wait 和 waitpid 来执行进程等待的功能:处理 ...

  4. system函数返回值

    system(执行shell 命令) 相关函数  fork,execve,waitpid,popen 表头文件  #include<stdlib.h> 定义函数  int system(c ...

  5. system函数返回值探究

    http://blog.chinaunix.net/uid-24774106-id-3048281.html?page=3 遇到system调用脚本,结果返回了256的情况,那么如何判断脚本是否正常成 ...

  6. c语言system返回信息,理解c语言system函数的返回值

    作者:新浪微博(@NP等不等于P) 计算机学习微信公众号(jsj_xx) c语言中的system函数可以说是程序执行时的一道重生之门,其重生妙效犹如我们之前<透析硬链接和软链接的区别>一文 ...

  7. system函数返回值,Linux

    理论 我们先看下man手册是怎么说的man system RETURN VALUEThe value returned is -1 on error (e.g., fork(2) failed), a ...

  8. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)

    1. 发布-订阅概念 发布-订阅 模式包含两种角色,分别为发布者和订阅者. 订阅者可以订阅一个或者若干个频道(channel): 而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都可以收到此消 ...

  9. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

最新文章

  1. Idea用maven给springboot打jar包
  2. java kryo_kryo序列化 - Java序列化期间的错误
  3. 知乎高赞回答:走上科研之路,需要培养什么能力?怎样培养这些能力?
  4. PDC - C#4.0 以及未来
  5. W3C XSL Transformations (XSLT) Version 2.0 翻译计划
  6. 给想学python-要学 Python 需要怎样的基础?
  7. 11-jQuery的事件绑定和解绑
  8. 【终极办法】windows下安装完MySQL,为什么cmd不识别命令?
  9. 仿Jquery链式操作的xml操作类
  10. 无法显示验证码去掉html,如何去除验证码-模版风格-易通免费企业网站系统 - Powered by CmsEasy...
  11. 当你伤心时的飞鸽传书
  12. mysql killing slave_MySQL Slave 触发 oom-killer解决方法
  13. 怎样打开.jar格式文件,怎样运行.jar格式文件
  14. Scrapy爬虫框架的原理与实战[阳光政务爬虫项目]
  15. hdu 6357 Hills And Valleys (DP)
  16. OpenCV 形态学操作应用——提取水平与垂直线
  17. JS实现点击按钮切换图片
  18. 【Python办公自动化】快速将excel按照某列不同的值批量拆分
  19. 软件设计的不同模型:瀑布式、快速原型法、迭代式(敏捷)
  20. intellij idea中插件的安装方法及推荐

热门文章

  1. 腾讯通服务器查看消息记录,rtx怎么在服务端查看用户登录日志
  2. js 实现刮刮乐卡片效果
  3. rulebook 简单记录
  4. 论文投稿指南——中文核心期刊推荐(地质学 2)
  5. Element对象的firstchild和lastChild获取属性值的undefined问题
  6. 将笔记本电脑设置成WiFi无线上网共享热点
  7. python3 获取京东冰箱的相关数据(学习记录)
  8. Java基础项目一:家庭记账软件
  9. Shell内值命令之read
  10. chrome下的HTML打印