wait,waitpid学习测试

摘要:
等等,waitpid学习测试任务的详细信息1.学习使用manwait和manwaitpid使用waitwaitpid。2.编写wait的测试代码,这应该表明您理解wait返回值的每一位的含义。实验步骤1.使用manwait和manwaitpid学习waitwaitpid的用法。使用man2wait查看函数原型,其中可以看到waitid()函数是在2.6版本中添加的。Waitpid函数函数:Waitpid()具有与wait()相同的函数,但它不必等待第一个终止的子进程。它还有几个选项,例如提供wait()函数的非阻塞版本。实际上,wait()函数只是waitpid()函数的一个特例。
wait,waitpid学习测试

任务详情

1 用man wait, man waitpid学习wait waitpid的使用
2 写出wait 的测试代码,要能说明你理解了wait 的返回值的每一位的含义

实验步骤

1.用man wait, man waitpid学习wait waitpid的使用

使用man 2 wait可以看到函数原型,其中可以看到在2.6版本中新增叫了waitid()函数。
可以看到函数头文件:

#include <sys/types.h> /* 提供类型pid_t的定义 */
#include <sys/wait.h>
wait,waitpid学习测试第1张wait,waitpid学习测试第2张wait,waitpid学习测试第3张

wait()函数功能:wait()函数使父进程暂停执行,直到它的一个子进程结束为止,该函数的返回值是终止运行的子进程的PID. 参数status所指向的变量存放子进程的退出码,即从子进程的main函数返回的值或子进程中exit()函数的参数。如果status不是一个空指针,状态信息将被写入它指向的变量。
waitpid函数功能:waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能等。实际上wait()函数只是waitpid()函数的一个特例。

2.写出wait 的测试代码,要能说明你理解了wait 的返回值的每一位的含义

宏定义描述:
WIFEXITED(wstatus):如果进程子进程正常结束,返回一个非零值
WEXITSTATUS(wstatus):返回子进程退出码;该值由状态参数的最低有效8位组成(仅当WIFEXITED返回值非零时该macro才会被调用)
WIFSIGNALED(wstatus):如果子进程被一个信号终止,则返回一个非零值
WTERMSIG(wstatus):返回终止这个子进程的信号码(仅当WIFSIGNALED返回值非零时该macro才能被调用)
WCOREDUMP(wstatus):如果这个子进程生成了一个核心转储(core dump),返回一个非零值(仅当WIFSIGNALED返回值非零时该macro才会被调用)
WIFSTOPPED(wstatus):如果子进程因接收一个信号暂停,返回一个非零值
WSTOPSIG(wstatus):返回这个暂停信号的信号码(仅当WIFSTOPPED返回值非零时该macro才会被调用)
WIFCONTINUED(wstatus):如果子进程因接收一个信号而恢复运行,则返回一个非零值

测试代码1:

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
main()
{
        pid_t pc,pr;
        pc=fork();
 
       	if(pc<0) /* 如果出错 */
               printf("error ocurred!/n");
    	  else if(pc==0){ /* 如果是子进程 */
        	       printf("This is child process with pid of %d
",getpid());
       		       sleep(10); /* 睡眠10秒钟 */
           		 }
     	   else{ /* 如果是父进程 */
              pr=wait(NULL); /* 在这里等待 */
              printf("I catched a child process with pid of %d
",pr);
      	  } 
       exit(0);
}
wait,waitpid学习测试第4张 测试代码2: ``` #include #include #include main() { int status; pid_t pc,pr;
    pc=fork();
    if(pc<0) /* 如果出错 */
           printf("error ocurred!
");
    else if(pc==0){ /* 子进程 */
           printf("This is child process with pid of %d.
",getpid());
           exit(3); /* 子进程返回3 */
    }
    else{ /* 父进程 */
           pr=wait(&status);
           if(WIFEXITED(status)){ /* 如果WIFEXITED返回非零值 */
                   printf("the child process %d exit normally.
",pr);
                   printf("the return code is %d.
",WEXITSTATUS(status));
           }else /* 如果WIFEXITED返回零 */
               printf("the child process %d exit abnormally.
",pr);
    }

}

<img src="https://img2018.cnblogs.com/blog/1800808/201911/1800808-20191110140918842-1297064091.png"   heigth="400"/>

免责声明:文章转载自《wait,waitpid学习测试》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇phpBB3导入版面的Python脚本CSS 基本样式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ZYNQ 7020学习笔记之PL侧普通信号中断PS的实验

1、参考 UG585 网络笔记 2、理论知识 见中断部分 3、实验目的 练习使用PL侧的普通信号来中断PS处理器。 4、实验过程 建立工程,设置并初始化串口中断,在运行程序之后,如果串口接收到N(1-63)个字节数据,则产生串口中断,Zynq响应中断,将数据从RXFIFO读出之后写入到DDR3预定的地址中。 5、实验平台 Microphase ZUS zy...

linux处理僵尸进程

由来 在linux下,如果一个进程终止,内核会释放该进程使用的所有存储区,关闭所有文件句柄等,但是,内核会为每个终止子进程保留一定量的信息。这些信息至少包括进程ID,进程的终止状态,以及该进程使用的CPU时间。当终止子进程的父进程调用wait或waitpid时就可以得到这些信息 僵尸进程指:一个进程退出后,而其父进程并没有为它收尸(调用wait或waitp...

树形DP+RMQ+单调队列(Bob’s Race HDU4123)

题意:有n个房子,这些房子被n-1条道路连接,有一些运动员从一个房子为起点尽可能跑最远的距离且不能通过一条道路超过两次,这些运行员不能选择同样的起点,这些运动员跑的最远距离和最近距离的差值不能超过Q,这些运行员的起点房间编号都是连续的,问最多可以选择多少个运动员跑步? 分析:就是给出一颗树形图,先用dp求出每个点所能经过的最远距离,然后用rmq求区间最值,...

浅析linux中鼠标数据读取

http://blog.chinaunix.net/u3/108121/showart_2282259.htmlluther@gliethttp:~$ ll /dev/input/micecrw-rw---- 1 root root 13, 63 2009-07-09 15:54 /dev/input/mice我们就是去读/dev/input /mice设...

Android源码分析(一)-----如何快速掌握Android编译文件

一 : Android.mk文件概述 主要向编译系统指定相应的编译规则。会被解析一次或多次。因此尽量减少源码中声明变量,因为这些变量可能会被多次定义从而影响到后面的解析。这个文件的语法会把源代码组织成模块,每个模块属于下列类型之一: - APK程序:一般的Android程序,编译打包生成apk文件。 - JAVA库:java类库,编译打包生成jar包文件。...

java调用dll(native方法的实现)

java 中有许多native 方法,下面简单研究下native 方法的实现以及在java 中调用native 方法。 下面以简单的操作加减乘除实现 1. 新建java 类 源码如下: packagecom.zd.bx; public classOperation { public native int add(int a, intb);} 2...