Unix学习笔记-------Unix编程实例练习

原创 2015年11月20日 16:14:40
下面我们来看一下例子:
/*
对于这个例子:
我有几点要说明:
1.如何看待这个例子???
2.弄懂每一条语句的作用???

3.


*/


   Program source


       #include <sys/wait.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <stdio.h>


       int
       main(int argc, char *argv[])
       {
           pid_t cpid, w;   //定义两个进程标识符变量
           int status;   // 定义一个整型变量status
  


           cpid = fork();
           if (cpid == -1) {
               perror("fork");
               exit(EXIT_FAILURE);   //如何看待这个  参数:EXIT_FAILURE  ???
           }


           if (cpid == 0) {            /* Code executed by child */   被子进程执行的代码
               printf("Child PID is %ld\n", (long) getpid());   // getpid()即:获取本进程的pid号  
               if (argc == 1)
                   pause();                    /* Wait for signals */
               _exit(atoi(argv[1]));


           } else {                    /* Code executed by parent */
               do {
                   w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);  // 如何看待 waitpid()的返回值??? waitpid()做了哪些工作????是内核记录下每一个终止进程的pid吗???
                   if (w == -1) {
                       perror("waitpid");
                       exit(EXIT_FAILURE);
                   }


                   if (WIFEXITED(status)) {
                       printf("exited, status=%d\n", WEXITSTATUS(status));  //为什么必须使用 WEXITSTATUS(status)这个函数来打印 ????
/*
我现在开始明白,为什么需要WEXITSTATUS(status)。
因为,status在linux内核中,其实是用“位”进行存储的
而WEXITSTATUS(status)函数就是对这些位进行一些必要的操作,比如
一个整型变量即:32位,占用4个字节,所以为了合理有效的利用这些位,让这32个位可以用于表示不同的标志。
而: WEXITSTATUS()则可以从这个32位的整型变量中取出那些与自己对应的位并进行阐释。
*/
                   } 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");
                   }
               } while (!WIFEXITED(status) && !WIFSIGNALED(status));
               exit(EXIT_SUCCESS);
           }
       }
  
  
  
  
  
  
  
  /*
我的疑问是:为什么我们在设计exit()函数的时候,给它定义了参数????
不定义参数不行吗????
单纯的设计exit()用于终止一个进程不行吗??? 为什么还要做一个多余的工作???即: 给父进程传递一个参数
exit()函数的参数有什么用????
是用于告诉 
  
  
  我猜测是这样的:
Linux内核每当终止一个进程之前,都会把这个进程的一些重要信息,先保存在内核中,比如 该进程的父进程的id号,进程的终止原因等。
 而这些都是保存在Linux内核当中的。
 Linux内核预先定义了一些宏,用于说明该进程的终止原因,这些宏的本质是一些整型变量,他们被保存在一段地址空间中,而当某一个进程调用
 wait()或者waitpid()函数时,该函数实际是:该函数实际上是与内核沟通的,它告诉Linux它想要知道某一个进程的终止原因,而Linux内核则会查看自己保存的有没有它请求的这个进程的相关信息。
 如果有的话,就把内核中表示终止原因的变量的地址告诉wait函数。
 
 
  */

《UNIX环境高级编程》 —— 书中实例编译、运行

想认真学习《UNIX环境高级编程》的人士可能都想把书中的实例给敲一遍,运行看一下效果。但对于新手来说,可能会有一定的困难,因为例子中用到的头文件和一些函数不知道在哪里,编译可能也会出问题。这边文章就是...
  • wangyuling1234567890
  • wangyuling1234567890
  • 2014年04月02日 22:59
  • 1318

《UNIX环境高级编程》 —— 书中实例编译、运行

想认真学习《UNIX环境高级编程》的人士可能都想把书中的实例给敲一遍,运行看一下效果。但对于新手来说,可能会有一定的困难,因为例子中用到的头文件和一些函数不知道在哪里,编译可能也会出问题。这边文章就是...
  • wangyuling1234567890
  • wangyuling1234567890
  • 2014年04月02日 22:59
  • 1318

《Unix-Linux编程实践教程》读书笔记(一)

写在最前:          第一遍:零零散散的花了近两个月的时间读了本书的第一遍,这是一本很适合刚刚掌握一些计算机基础知识的人读的书。学习的思路非常明确,能做什么?怎么做?自己动手?三个方面符合认知...
  • yongchurui
  • yongchurui
  • 2014年03月27日 23:20
  • 3908

Unix和Linux下C语言学习指南

引言   尽管 C 语言问世已近 30 年,但它的魅力仍未减退。C 语言继续吸引着众多的开发者,他们为了编写、移植或维护应用程序而必须学习新技能。   本文是为了满足对C语言初学者或想提高...
  • luo964061873
  • luo964061873
  • 2014年03月01日 13:18
  • 3296

UNIX再学习 -- shell编程

UNIX环境高级编程看了三章,遇到不少重定向等shell命令。本想到Linux时再讲,看来有必要提前了。之前有看过一本《嵌入式Linux软硬件开发详解》这本书里有简单介绍了一部分shell常用命令,就...
  • qq_29350001
  • qq_29350001
  • 2017年03月21日 14:45
  • 1251

《Unix环境高级编程》学习笔记:从点到面总结

以前在课堂上学习过《Unix初级教程(第四版)》,对于Unix有了一点了解。由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本《Unix环境高级编程》便在此列。希望能通过这本书...
  • benpaobagzb
  • benpaobagzb
  • 2016年03月03日 17:33
  • 486

学习linux/unix编程方法的建议

看了这篇文章,看来自己的路还很长,想成为一个合格的程序员,并不是一件简单的事情。努力吧,呆娃!下面是原文,转过来,作为我程序员之路的一个参考! ---------------------------...
  • wm_1991
  • wm_1991
  • 2015年10月04日 22:34
  • 1013

《UNIX环境高级编程》笔记--UNIX标准化及实现

1.UNIX标准化 1.1.ISO C 1989年后期,C程序设计语言的ANSI(American National Standards Institute)标准X3.159-1989得到批准(AN...
  • TODD911
  • TODD911
  • 2013年08月31日 16:52
  • 2552

Unix网络编程学习日记

今天开始拜读《Unix网络编程》。找到的源代码在Linux下有各种问题,最后决定还是自己从头写比较好。 从第一个时间服务程序开始学习。今天先看一下主要的头文件的作用。 在common.h中(参照 ...
  • pdcxs007
  • pdcxs007
  • 2015年02月11日 17:34
  • 2388

《UNIX环境高级编程》笔记:前言

为什么要学UNIX编程的理由很多很多,只说我身上的吧。和Windows不一样,大部分UNIX类操作系统是免费的,而且被专门设计来做服务器。当今大大小小各种公司,绝大部分服务器上都是用的UNIX类操作系...
  • fenghou1st
  • fenghou1st
  • 2015年01月27日 23:43
  • 449
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix学习笔记-------Unix编程实例练习
举报原因:
原因补充:

(最多只允许输入30个字)