apue《UNIX环境高级编程第三版》第二章答案详解

《Unix环境高级编程》课后习题(1-6章) 今天有时间来做一下课后习题,下面的答案是自己的理解,有一些也参考的网上的解答,并不保证正确性。第一章 ls命令查看文件信息,-l选项以长格式的形式查看文件详细信息,-i选项打印文件的i结点编号,-d选项,表示如果文件是目录文件,则只列出该目录本身的信息,不列出该目录内文件的信息,如果文件是符号链接,则打印该链接本身的信息,不打印所指向文件的信息。在Ubuntu上进行验证:       Uni 阅读详情

转载请注明本博客地址:http://blog.youkuaiyun.com/hubbybob1/article/details/46982215

UNIX高级编程第二章习题答案:

2.1在2.8节中基本数据类型可以在多个文件中定义。例如,在FreeBSD 8.0中,size_t在29个不同的文件中都有定义,由于一个程序可能包含这29个不同的头文件,在ISO C 却不允许对同一个名字进行多次typedef,那么如何编写这些头文件呢?

     答:这个问题可以通过一段小代码来验证,先编写2-1.c代码如下,那么调换头文件的顺序会造成什么样的结果呢?

<span style="font-size:18px;"><span style="font-size:18px;">#include <stdio.h>  
#include <unistd.h>  
#include <stdlib.h> 
#include "2-1-2.h"//把这两个.<span style="font-family:宋体;">h文件调换已下会出现什么样的结果呢</span>
#include "2-1-1.h"
#define  i 8 
int main()
{
 
   printf("%d  ",i);//<span style="font-family:宋体;">这个地方打印的结果是什么</span>,你可以试一试?????
   printf("\n");
   return 0;
}</span></span>

下面可以编写两个.h文件,如下:

<span style="font-size:18px;">//2-1-1.h

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#ifndef i  //采用的识#ifdef或者#ifndef的模式
#define  i  0
#endif

//2-1-2.h

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#ifndef i
#define  i 5
#endif</span>
这样设置一个检测的开开关,就可以解决多头文件重复typedef的问题了,如下:
<span style="font-size:18px;">#ifndef _MACHINE_TYPES_H_
#define _MACHINE_TYPES_H_

typedef int _int32_t;
typedef unsigned int _uint32_t;

.........

typedef _uint32_t _size_t;

.........

#enddef</span>
这样就可以避免重复定义了。

2.2检测系统的头文件。列出实现基本系统数据类型所用到的实际类型。

        答:我所使用的系统为Ubuntu版本的Linux系统,而Linux内核的头文件放在/usr/include/linux/和/usr/include/sys/两个目录下,在我么编写程序的时候总会添加一个头文件那就是:

#include<sys/types.h>
那么我们就去看看这个头文件到底做了什么,在/usr/include/sys目录下,如下所示:
<span style="font-size:18px;">#ifndef _SYS_TYPES_H
#define _SYS_TYPES_H  1
 
#include <features.h>
 

__BEGIN_DECLS

#include <bits/types.h>
  
#ifdef  __USE_BSD
# ifndef __u_char_defined
typedef __u_char u_char;
typedef __u_short u_short;
typedef __u_int u_int;
typedef __u_long u_long;
typedef __quad_t quad_t;
typedef __u_quad_t u_quad_t;
typedef __fsid_t fsid_t;
# define __u_char_defined
# endif
#endif
。
。
。 
</span>
但是这里面依然找不到,拿就要找他的头文件了:
<span style="font-size:18px;"><span style="font-size:18px;"><pre name="code" class="cpp">#include <features.h>//在目录 /usr/include 下用来定义和取消一些开关所用的,自己去查看</span></span>
#include <bits/types.h>//在目录 /usr/include/bits 下
那么就来看看bits下的types.h文件吧。如下:                                                                                                                                                   
<span style="font-size:18px;"><pre name="code" class="cpp">#include <features.h>
#include <bits/wordsize.h>
  
/* Convenience types.  */
typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
typedef unsigned long int __u_long;
  
/* Fixed-size types, underlying types depend on word size and compiler.  */
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
#if __WORDSIZE == 64
typedef signed long int __int64_t;
typedef unsigned long int __uint64_t;
#elif defined __GLIBC_HAVE_LONG_LONG
 __extension__ typedef signed long long int __int64_t;
__extension__ typedef unsigned long long int __uint64_t;
#endif
。
。
。  
#define __S16_TYPE    short int
#define __U16_TYPE    unsigned short int
#define __S32_TYPE    int
#define __U32_TYPE    unsigned int
#define __SLONGWORD_TYPE  long int
#define __ULONGWORD_TYPE  unsigned long int
#if __WORDSIZE == 32
#define __SQUAD_TYPE   __quad_t
#define __UQUAD_TYPE   __u_quad_t
#define __SWORD_TYPE   int
#define __UWORD_TYPE   unsigned int
#define __SLONG32_TYPE   long int
#define __ULONG32_TYPE   unsigned long int
。
。
。
</span>

2.3改写图2-17中的程序,使其在sysconf为OPEN_MAX限制返回LONG_MAX时,避免进行不必要的处理。

    答:尽然要修改程序,那就要先看看源程序的到底实现了什么,源码如下所示:

<span style="font-size:18px;">#include <stdio.h>                                                                                                                                   
#include <limits.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>

#ifdef OPEN_MAX
static long openmax = OPEN_MAX;//OPEN_MAX每个进程最大打开文件数,linux为1024
#else
static long openmax = 0;
#endif

/* If OPEN_MAX is indeterminate ,no gurante this is adequate */
#define OPEN_MAX_GUESS 256

long open_max(void)
{
	//其实if内的程序没有执行因为已经定义了OPEN_MAX,
           if(openmax == 0)
		{
			errno = 0;
			if((openmax = sysconf(_SC_OPEN_MAX)) < 0)//_SC_OPEN_MAX:每个进程最大打开文件数
			 {
				printf("1.openmax= %ld\n",openmax);
				if(errno == 0)
					openmax = OPEN_MAX_GUESS; /*it's indeterminate*/
				else
					printf("sysconf error for _SC_OPEN_MAX");
			 }	
		}
	printf("2.openmax= %ld\n",openmax);

  return(openmax);
}
int main()
{
  open_max();
  return 0;

}//编译 gcc -o 2-17 2-17.c 然后运行</span>

有三种情况:

1,一开时OPEN_MAX是被定义过的,有值linux下为1024,此openmax一开始就被初始化为1024,这一样就直接运行第三个printf

2,假设初始化openmax为0,那结果会使怎样的呢,同样只会执行第三个printf,打印的结果没有变化,因为通过sysconf获取linux的OPEN_MAX的值为1024,下面的if不成立,

<span style="font-size:18px;">if((openmax = sysconf(_SC_OPEN_MAX)) < 0)//_SC_OPEN_MAX:每个进程最大打开文件数</span>

那么就执行第三个printf

3,假设openmax被初始话为0,而通过sysconf函数获取的值小于0成立,那么就会执行地一个printf

<span style="font-size:18px;">printf("1.openmax= %ld\n",openmax);</span>
此时就会查看errno的值,来确定是否为sysconf erro,那么问题来了当sysconf返回的值限制值LONG_MAX时,怎么处理呢,这就是本题的答案,代码如下所示:

#include <stdio.h>
#include <limits.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/resource.h>//rlimit的相关库,要不然会报未定义错误

#define OPEN_MAX_GUESS 256


long open_max(void)
{
   long openmax;
   struct rlimit rl;
   if((openmax = sysconf(_SC_OPEN_MAX)) < 0 || openmax == LONG_MAX)//_SC_OPEN_MAX:每个进程最大打开文件数
     {
		   if(getrlimit(RLIMIT_NOFILE,&rl) < 0)//获取每个进程最大打开文件描述符数
				  printf("1.can't get file limit ");
       if(rl.rlim_max == RLIM_INFINITY)
				  openmax = OPEN_MAX_GUESS;
       else
				openmax = rl.rlim_max;
						 
     }
		 printf("2.openmax == %ld \n",openmax);
}
int main()
{
  open_max();
  return 0;
}
如果OPEN_MAX未确定或者大的出奇(即等于LONG_MAX),那么可用getrlimit得到每个进程的最大打开文件描述符数。运行的结果如下:



APUE:APUE(Unix环境中的高级编程)的个人作业答案 为什么创造这个项目 此项目为《 UNIX环境高级编程》的课后习题个人答案,这种偏实际应用的书,需要配合每一章后面的习题使用效果更佳。 每一章的习题答案放在独立的目录中,代码以习题号命名,例如第一章第一题的代码(如果有的话)将命名为1_1.c 操练起来! 导航 立即下载

相关推荐

apue部分习题答案

apue部分习题答案,有需要的同学自行下载

APUE-第二章学习-UNIX标准化及实现-习题

APUE-第二章学习-UNIX标准化及实现-习题

SJWL2012的专栏 650

APUE(linux环境c编程)

unix环境下c编程,E文的,初学者可以作为挑战书籍,老手可以放在电脑里随时翻看,包含每章习题答案

《UNIX环境高级编程 第3版》习题3.2的个人解答

题目: 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理。 以下是我编写的测试代码,其中apue.h是《UNIX环境高级编程 第3版》作者自己整理的头文件,其中包含了常用的一些系统头文件,err_sys的声明和定义在书中的附录B中均有提及。 代码的编写,也是尽量模范该书作者的风格来着。 #include &quot;apue.h&quot; #include #

u011418173的博客 759

J-Flash手动添加华大HC32F460型号全攻略

在嵌入式开发中,Flash编程算法是连接调试工具与微控制器的重要桥梁,它定义了芯片存储器的擦除、编程和校验等底层操作规范。其原理是通过调试接口将算法代码加载到目标芯片的RAM中执行,从而实现对Flash存储器的访问与控制。这项技术的核心价值在于打破了工具链对芯片型号的固有支持限制,使得开发者能够灵活适配各种新兴或定制化的微控制器。在工程实践中,当面对J-Link等主流调试器官方支持包更新滞后时,手动添加芯片型号成为保障开发效率的关键技能。本文以华大半导体的HC32F460系列MCU为例,详细解析了如何通过配

weixin_29192365的博客 353

伺服电机开发实战指南

伺服电机作为工业自动化的核心部件,正经历前所未有的技术革新。本文从基础原理出发,详细介绍了伺服电机的分类、工作原理和特性,分析了伺服电机系统组成与核心部件,探讨了企业级开发技术,包括控制算法、通信协议和故障诊断等高级功能,并提供了实战案例分析,从行业应用到具体开发步骤,展示了伺服电机的工程实现。通过深入理解伺服电机的原理、掌握开发技术、学习应用案例,可以实现伺服系统的高性能开发与应用。

全栈 1683

《APUE》习题 10.11

题目:1 0 . 11 修改程序3 - 3,要求: ( a )将B U F F S I Z E改为1 0 0;( b )用s i g n a l _ i n t r函数捕捉S I G X F S Z 信...

ckpx42539的博客 166

matlab/simulink saw谐振器仿真,基于Matlab的SAW模态耦合模型的仿真研究

第32卷 第 4 期Vol. 32 No. 4重 庆 理 工 大 学 学 报 (自然科学)Journal of Chongqing University of Technology( Natural Science)2 0 1 8年 4 月Apr. 2018doi : 10.3969/j . issn. 1674-8425(z). 2018.04.002本文引用格式 :李志鹏,马龙祥,孟旭,等•基...

weixin_36192634的博客 1386

apue《UNIX环境高级编程第三版》第一章答案详解

大家好,从这周开始学习apue《UNIX环境高级编程第三版》,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步。废话少说,直接上课后习题了。 UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和l l是不同的。 答:这个验证有很多方法可使用命令ls 、cd、vim等,目录l指向当前目录,目录l l指向父目录,在根目

hubbybob1专栏 4778

锐捷交换机路由器配置全攻略:从基础命令到高级功能(附常用命令速查表)

本文提供锐捷交换机路由器配置全攻略,涵盖从基础命令到高级功能的详细指南,包括VLAN划分、DHCP配置、链路聚合等实用技巧,并附常用命令速查表,帮助网络管理员快速掌握锐捷设备运维。

weixin_29285605的博客 519

ATM火控电容改造实战:提升速凌无刷电机动力与系统稳定性

在嵌入式系统与电机驱动领域,电源完整性是保障电路稳定运行的核心基础。其核心原理在于通过合理的电容网络设计,为负载提供瞬时大电流并滤除高频噪声,从而维持电压稳定。这项技术的核心价值在于能显著提升系统的动态响应能力与可靠性,避免因电压跌落导致微控制器复位或功率器件过应力。典型的应用场景包括无人机电调、机器人关节驱动以及各类需要快速响应的伺服系统。本文聚焦于水弹发射器ATM火控系统的硬件迭代,通过详解电容的选型、布局与焊接流程,特别是针对速凌五代无刷电机的高启动电流特性,系统性地阐述了如何通过强化电源储能与芯片去

weixin_33868027的博客 559

【转】apue《UNIX环境高级编程第三版》第一章答案详解

原文网址:http://blog.youkuaiyun.com/hubbybob1/article/details/40859835 大家好,从这周开始学习apue《UNIX环境高级编程第三版》,在此,我要感谢网易的一个工程师朋友和室友,没有他们,我不会开始真正的学习这本书,希望大家以后开始慢慢进步。废话少说,直接上课后习题了。 UNIX高级编程第一章习题答案: 1.1在系统上验证,除根目录外,目录l和...

weixin_30608503的博客 177

AI:Coze、Dify、n8n:三款低代码工具如何选?

Coze、Dify、n8n:三款低代码工具如何选?

Kant2048的博客 2808

探索APUE:深入理解和实践Unix环境编程

探索APUE:深入理解和实践Unix环境编程 是一个开源的项目,旨在为开发者提供对Unix环境编程的全面指南和实用代码示例。该项目由VVictorQi维护,它基于著名的书籍《Advanced Programming in the UNIX Environment》(APUE)进行编译整理,将书中的理论知识与实际代码相结合,帮助程序员在实践中提升技能。 项目简介 APUE项目不仅包含了原书中的丰富内...

gitblog_00057的博客 553

AutoSAR系列讲解(入门篇)4.1-BSW概述

BSW概述,主要讲解BSW的结构组成

雪云飞星的博客 4万+

借助AI高效写出结构严谨、内容专业的课题申报书:10大核心模块拆解(附实用提示词)

在很多老师和科研人员眼中,写一份高质量的课题申报,确实是一件非常困难的事。难就难在不只是要说清楚写了什么研究内容,还要体现申报书的可行性和创新性。七哥除了自己写课题,也经常指导会员同仁使用高级学术版搞定课题的申报工作,摸索出了一套行之有效的借助AI申报课题的技巧,在这篇文章中,我将给大家点明课题申报书的10大核心模块的写作技巧,还会给大家一些提示词模板供大家参考,如果你也正准备申报课题,那么这篇文章一定不要错过!特别说明的是,提示词的使用并不是一蹴而就的,是专业思考的延伸和AI化专业表达,过程中需要多次的调

智能AI让学术科研更容易 450

apue.h头文件(Unix环境高级编程第三版)的安装

配置apue.h头文件的时候,作为Linux初学者,网上的答案都是不太适用,问题百出,弄了好久总算完成! 注意我使用的是Fedora26,方法同样适用于CentOS和Ubuntu 1、下载源码文件 进入www.apuebook.com/code3e.html 单击here进行下载 2、保存 3、tar解压 解压:$ tar -zxv -f fi

Spade_的博客 2万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

《Linux程序设计》 -> 《Linux高级程序设计》 -> 《Unix环境高级编程》

这是csdn linux版主写的: 《Linux程序设计》->《Linux高级程序设计》-《Unix环境高级编程》     可以说这个顺序代表了一般Linux程序猿的学习道路,《Linux程序设计》内容全面,易于入手,适用于新手详细了解Linux下编程,《Linux高级程序设计》则相当于在前一本的基础上进行了高度抽象和概括,介绍了Linux下工具链,可移植性,内核学习,图形编程等等

wusuopuBUPT的专栏 4240

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[apue]UNIX高级环境编程ver3勘误表[持续更新]

本文记录在阅读《UNIX环境高级编程》第三版过程中发现的错误,写这篇文章时阅读到第三章文件I/0. 本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了前一版风格的基础上,根据最新的标准对内容进行

尘世中迷途小书童 600

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

unix环境高级编程第三章习题的一些拙见

apu第三章习题

算法虐我千百遍 1115

unix编程学习路线图

http://hi.baidu.com/tkblue/blog/item/98aef5cade45fb42f21fe795.html 建议学习路径:   首先先学学编辑器,vim, emacs什么的都行。 然后学make file文件,只要知道一点就行,这样就可以准备编程序了。   然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。

yake25的专栏 2609

学习linux/unix编程方法的建议,学习Linux的四个步骤

862

UNIX环境高级编程习题答案——第四章

会输出符号链接所指向文件的文件类型。

qq_27637315的博客 1172

unix环境高级编程第四章习题的一些拙见

重新开始更新第四章的内容,每天一点点。 apue4.1: 由于在这里lstat是不跟随符号文件的,而stat是跟随符号文件的,这样一来,如果使用stat,而不使用lstat那么就无法观察到符号文件。在书上4.3姐中有提到。 apue4.2: 首先我在ubuntu的shell上查看原来的umask是多少,结果是0002,这里touch一个文件是不确定的,但是其他者的权限中写的权限一定是没

算法虐我千百遍 723

OS X下UNIX环境高级编程(第三版)学习日志-第一章ChapterI,编译apue包与第一个例程...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33898876的博客 140
上一篇: GTK+2.0编程范例代码分析-第二章(1)
下一篇: UCOSII task 任务建立笔记记录
葫芦娃二娃
博客等级 码龄15年 1850粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值