在 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 编辑该文件,向其添加一个头文件,然后退出。 在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码_第1张图片

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

    在这里插入图片描述
    在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码_第2张图片

  7. 再次执行 make,报错如下
    在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码_第3张图片

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

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

    在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码_第4张图片
    在这里插入图片描述
    修改后 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, 完成编译
    .在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码_第5张图片

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

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

    在这里插入图片描述

  11. 至此,可以在自己的代码中使用头文件 apue.h 进行编程开发了。
    在 Ubuntu_20.04 中使用 UNIX 环境高级编程(第三版) 源码_第6张图片

你可能感兴趣的:(Embed,System,unix,ubuntu,linux)