您的位置:首页 > 编程语言

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

2015-11-20 16:14 316 查看
下面我们来看一下例子:

/*

对于这个例子:

我有几点要说明:

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函数。

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: