在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码

在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码

  1. 下载源代码。网址如下,下载下来的压缩包为 src.3e.tar.gz

    http://apuebook.com/code3e.html
    
  2. 新建一个目录,将压缩包放进去。

    $ cd /home
    $ makedir apue_src_code # 建好路径后,将压缩包放进去
    
  3. 进入目录, 并解压缩

    $ cd apue_src_code
    $ tar -zxvf src.3e.tar.gz
    
  4. 需要安装libbsd-dev

    $ sudo apt-get install libbsd-dev
    
  5. 进入解压缩后的路径下,执行make命令

    $ cd apue.3e/
    $ make
    
  6. 系统报错如下,发现出错文件为devrdev.c,通过 locate 找到该文件路径,并通过vim 编辑该文件,向其添加一个头文件<sys/sysmacros.h>,然后退出。

    $ locate -b devrdev.c
    $ vim /home/vmuser/apue_src_code/apue.3e/filedir/devrdev.c
    

    在这里插入图片描述
    在这里插入图片描述

  7. 再次执行 make,报错如下
    在这里插入图片描述

  8. 查找并用 vim 修改buf.c文件,在原文件第89-93行,98行,104行,111行,添加条件编译代码,修改后的文件如下

    $ locate --basename buf.c #查找文件路径
    $ vim stdio/buf.c
    

    在这里插入图片描述
    在这里插入图片描述
    修改后 buf.c 的代码如下

    #include "apue.h"
    
    void	pr_stdio(const char *, FILE *);
    int		is_unbuffered(FILE *);
    int		is_linebuffered(FILE *);
    int		buffer_size(FILE *);
    
    int
    main(void)
    {
    	FILE	*fp;
    
    	fputs("enter any character\n", stdout);
    	if (getchar() == EOF)
    		err_sys("getchar error");
    	fputs("one line to standard error\n", stderr);
    
    	pr_stdio("stdin",  stdin);
    	pr_stdio("stdout", stdout);
    	pr_stdio("stderr", stderr);
    
    	if ((fp = fopen("/etc/passwd", "r")) == NULL)
    		err_sys("fopen error");
    	if (getc(fp) == EOF)
    		err_sys("getc error");
    	pr_stdio("/etc/passwd", fp);
    	exit(0);
    }
    
    void
    pr_stdio(const char *name, FILE *fp)
    {
    	printf("stream = %s, ", name);
    	if (is_unbuffered(fp))
    		printf("unbuffered");
    	else if (is_linebuffered(fp))
    		printf("line buffered");
    	else /* if neither of above */
    		printf("fully buffered");
    	printf(", buffer size = %d\n", buffer_size(fp));
    }
    
    /*
     * The following is nonportable.
     */
    
    #if defined(_IO_UNBUFFERED)
    
    int
    is_unbuffered(FILE *fp)
    {
    	return(fp->_flags & _IO_UNBUFFERED);
    }
    
    int
    is_linebuffered(FILE *fp)
    {
    	return(fp->_flags & _IO_LINE_BUF);
    }
    
    int
    buffer_size(FILE *fp)
    {
    	return(fp->_IO_buf_end - fp->_IO_buf_base);
    }
    
    #elif defined(__SNBF)
    
    int
    is_unbuffered(FILE *fp)
    {
    	return(fp->_flags & __SNBF);
    }
    
    int
    is_linebuffered(FILE *fp)
    {
    	return(fp->_flags & __SLBF);
    }
    
    int
    buffer_size(FILE *fp)
    {
    	return(fp->_bf._size);
    }
    
    #elif defined(_IONBF)
    
    #if 0
    #ifdef _LP64
    #define _flag __pad[4]
    #define _ptr __pad[1]
    #define _base __pad[2]
    #endif
    #endif
    
    int
    is_unbuffered(FILE *fp)
    {
    #if 0
    	return(fp->_flag & _IONBF);
    #else
    	return(fp->_flags & _IOLBF);
    #endif
    }
    
    int
    is_linebuffered(FILE *fp)
    {
    #if 0
    	return(fp->_flag & _IOLBF);
    #else
    	return(fp->_flags & _IOLBF);
    #endif
    }
    
    int
    buffer_size(FILE *fp)
    {
    #ifdef _LP64
    #if 0
    	return(fp->_base - fp->_ptr);
    #endif
    	return(fp->_IO_buf_end - fp->_IO_buf_base);
    #else
    	return(BUFSIZ);	/* just a guess */
    #endif
    }
    
    #else
    
    #error unknown stdio implementation!
    
    #endif
    
  9. 再次make, 完成编译
    .在这里插入图片描述

  10. 将apue.h 文件和对应的静态链接库 libapue.a 放到 系统/usr 路径下

    $ sudo cp ./include/apue.h /usr/include/
    $ sudo cp ./lib/libapue.a /usr/local/lib/
    

    在这里插入图片描述

  11. 至此,可以在自己的代码中使用头文件 apue.h 进行编程开发了。
    在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

本道自然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值