• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 深入浅出《Unix环境高级编程》:Unix基础知识(三)

深入浅出《Unix环境高级编程》:Unix基础知识(三)

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了深入浅出html5编程,深入浅出cuda编程,深入浅出数据分析,深入浅出,深入浅出的意思等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

深入浅出《Unix环境高级编程》:Unix基础知识(三)


有些汗颜~,一年半都没有更新了,来了一家新单位,做了自己如愿以偿的嵌入式,回过头来想想,其实也没什么的;
这次我继续,深入浅出的unix环境高级编程系列,希望能坚持下去:)

1、程序和进程
其实这两个概念很好解释,程序是存储在磁盘上的可执行文件;进程是这个可执行文件运行起来再内存中的状态;
举一个不太形象的例子吧;程序和进程的关系像汽车,汽车停在车库就是程序,跑起来的状态就是进程了;
2、进程号PID
在unix和类Unix系统中用进程号标识一个进程;是个非负整数;
可以写一个简单的程序打印一下PID的值,代码如下:

  1. #include
  2. #include
  3. #include

  4. int main(int argc, char * argv[])
  5. {
  6. pid_t pid = 0;
  7. pid = getpid();

  8. printf("this proccess id is %d\n", pid);
  9. return 0;
  10. }
编译语句是gcc -o pid pid.c
执行结果是:
  1. ./pid
  2. this proccess id is 24047
  3. ./pid
  4. this proccess id is 24048
  5. ./pid
  6. this proccess id is 24050
  7. ./pid
  8. this proccess id is 24051
  9. # ./pid
  10. this proccess id is 24052
看着样子是每次的PID都不大一样;这样可以保证每次启动的时候检查一下是不是已经启动了这个程序了;一般讲pid存储成一个.pid的文件,来检测是否已经启动这个程序了;
改造了一下程序,如下:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include

  7. int main(int argc, char * argv[])
  8. {
  9. pid_t pid = 0;
  10. char * pidfile = "./freesir.pid";
  11. pid = getpid();
  12. int fd = 0;
  13. char pids[16] = {0};

  14. if(access(pidfile, F_OK) != -1)
  15. {
  16. printf("this program is already run in system.\n");
  17. return -1;
  18. }

  19. fd = open(pidfile, O_TRUNC | O_CREAT | O_RDWR);
  20. if(fd < 0)
  21. {
  22. printf("open pid file error!\n");
  23. return -2;
  24. }

  25. sprintf(pids, "%d", pid);

  26. if(write(fd, pids, strlen(pids)) != strlen(pids))
  27. {
  28. printf("write pid file error!\n");
  29. return -3;
  30. }

  31. sleep(10);

  32. unlink(pidfile);
  33. close(fd);
  34. printf("this proccess id is %d\n", pid);
  35. return 0;
  36. }
运行程序之后会在当前目录创建一个freesir.pid的文件,如果多次运行会报已经运行的错误;大概就是这样子啦;

3、进程控制
这里就简单介绍一下进程控制就好,unix环境高级编程后面会有更详细的介绍;
示例代码中只是写了一个简单的shell封装,我们还是分别写俩小程序单独解释吧;

  1. #include
  2. #include
  3. #include

  4. int main(int argc, char * argv[])
  5. {
  6. pid_t pid = 0;
  7. int status = 0;

  8. pid = fork();
  9. if(pid < 0)
  10. {
  11. printf("fork error!\n");
  12. return 0;
  13. }
  14. else if(pid == 0)
  15. {
  16. printf("i'm the child proccess. pid = %d\n", getpid());
  17. sleep(5);
  18. exit(127);
  19. }
  20. else if(pid > 0)
  21. {
  22. printf("i'm parent prccess. pid = %d, childpid = %d\n", getpid(), pid);
  23. }

  24. pid = waitpid(pid, &status, 0);
  25. if(pid < 0)
  26. {
  27. printf("waitpid error!\n");
  28. }
  29. return 0;
  30. }
上面的程序会打印父子进程的pid,可以看得出来,子进程是返回的0,且可以用getpid获取他的子进程ID;父进程返回的是子进程的PID;
最后使用waitpid等待子进程退出;出错了这里只是简单打印,其实是需要使用waitpid的三个宏来确性子进程的退出状态的;

  1. WIFEXITED(status)
  2. WEXITSTATUS(status)
  3. WIFSTOPPED(status)
这些以后可以在写,不展开啦;

今天就看这么多吧,越看越觉得linux很强大,折服。。。。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入浅出《Unix环境高级编程》:Unix基础知识(三)

相关文章

  • 2017-05-26Android开发系列通信篇之EventBus
  • 2017-05-224.1.1 Activity初学乍练
  • 2017-05-26实现Discuz论坛客户端应用源码,discuz源码
  • 2017-05-26Android四大组件之BroadcastReceiver
  • 2017-05-26FragmentStatePagerAdapter和FragmentPagerAdapter区别,fragmentpageradapter
  • 2017-05-26Android开发4: Notification编程基础、Broadcast的使用及其静态注册、动态注册方式,静态库与动态库编程
  • 2017-05-26ViewPager结合Fragment进行无限滑动,viewpagerfragment
  • 2017-05-26Linux内核系列—12.b.操作系统开发之从Loader跳入保护模式,12.bloader
  • 2017-05-26Activity之概览屏幕(Overview Screen),activityoverview
  • 2017-05-26Android 急速发布项目到 JitPack,androidjitpack

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android热补丁动态修复技术(二):实战!CLASS_ISPREVERIFIED问题!
    • AndroidStudio修改常用快捷键,androidstudio
    • [android] 手机卫士绑定sim卡,androidsim
    • Swift开发iOS应用(1)列表的实现
    • 一个规范的自定义View——Android开发艺术探索笔记
    • Android应用自定义View绘制方法手册
    • 移动端web头部header通用写法
    • 使用flume+kafka+storm构建实时日志分析系统
    • 2.6.2 菜单(Menu)
    • Android Studio创建/打开项目时一直处于Building“project name”Gradle project info的解决办法,androidgradle

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有