#include <sys/types.h>的作用

本文深入探讨了Unix/Linux系统中的基本系统数据类型,包括off_t、ptrdiff_t、size_t、ssize_t、time_t、clock_t、dev_t和pid_t等。详细解释了这些类型在不同编译环境下的行为,并提供了在Linux编程中有效利用这些类型的实用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <sys/types.h>

基本系统数据类型

是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。

linux编程中经常在应用程序源文件中包含<sys/types.h> 以访问 _LP64 和 _ILP32的定义。此头文件还包含适当时应使用的多个基本派生类型。尤其是以下类型更为重要:

 

  1.off_t 用于文件大小和偏移量。 
  2.ptrdiff_t 是一种带符号整型,用于对两个指针执行减法运算后所得的结果。  
  3. size_t 反映内存中对象的大小(以字节为单位)。 
  4.ssize_t 供返回字节计数或错误提示的函数使用。 
  5.time_t 以秒为单位计时。
  6.clock_t 表示系统时间(以时钟周期为单位)。

  7.dev_t 用于设备号。

  8.pid_t 文件为文本文件,内容只有一行, 记录了该进程的ID

  所有这些类型在 ILP32 编译环境中保持为 32 位值,并会在 LP64 编译环境中增长为 64 位值。用到的头文件。


### C/C++ 中 `sys/wait.h` 头文件使用方法 #### 函数概述 `sys/wait.h` 提供了一系列用于等待子进程终止并获取其退出状态的函数。这些函数对于父进程管理子进程非常重要。 #### 主要函数介绍 - **wait(int *status)** 此函数会挂起调用它的进程,直到其中一个子进程结束为止。如果没有任何子进程存在,则立即返回 `-1` 并设置 errno 为ECHILD[^2]。 ```c #include <sys/types.h> #include <sys/wait.h> pid_t pid; int status; pid = wait(&status); if (pid == -1) { perror("wait"); } ``` - **waitpid(pid_t pid, int *status, int options)** 提供了更灵活的方式去等待特定 PID 的子进程,并允许通过选项参数控制行为。例如可以指定不阻塞(waitpid(..., WNOHANG)) 或者只关心已停止的子进程(WUNTRACED)[^3]。 ```c pid_t child_pid; child_pid = fork(); if(child_pid == 0){ // 子进程中执行的任务... }else{ int wstatus; while ((w = waitpid(-1,&wstatus,WNOHANG | WUNTRACED)) > 0 ) { printf("Child %d exited\n", w); } } ``` - **宏定义** 为了方便解析由上述两个函数返回的状态码,在 `<sys/wait.h>` 中还提供了一些有用的宏来提取信息: | 宏名 | 描述 | |--| | WIFEXITED(status) | 如果子进程正常终止则返回真 | | WEXITSTATUS(status)| 当WIFEXITED为真时,返回子进程传递给exit()的实际值 | | WTERMSIG(status) | 返回导致子程序异常终止信号编号 | | WCOREDUMP(status) | 若子进程因接收到致命信号而创建核心转储,则返回非零 | #### 示例代码展示如何捕获子进程退出状态 下面是一个简单的例子展示了怎样利用 `wait()` 和相关宏处理子进程的信息: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main(void) { pid_t pid; int status; /* 创建新进程 */ switch (pid = fork()) { case -1: perror("fork error"); exit(1); case 0: /* code for the child process */ puts("This is Child Process."); sleep(2); /* simulate some work being done by this process */ _exit(7); /* terminate with non-zero status */ default: /* parent continues here */ puts("Waiting for child to complete..."); if (wait(&status) != pid) { fprintf(stderr,"wait error\n"); exit(1); } if (WIFEXITED(status)) printf("Normal termination, exit status=%d\n", WEXITSTATUS(status)); else if (WIFSIGNALED(status)) printf("Abnormal termination, signal number=%d%score dump\n", WTERMSIG(status), WCOREDUMP(status)? " (":" no "); break; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值