当前位置: 澳门新濠3559 > 操作系统 > 正文

本文地址,在UNIX或Linux系统中学习C很方便

时间:2019-11-22 03:29来源:操作系统
1. 解压文件 tar -zxvf src.3e.tar.gz   Unix环境高级编程(第三版) 代码编译 本文地址: 时间:2014.10.2 下载代码: 安装依赖库: sudo apt-get install libbsd-dev 进入 下载目录make 复制 头文件和动态链

1. 解压文件

tar -zxvf src.3e.tar.gz

 

Unix环境高级编程(第三版) 代码编译

本文地址:

时间:2014.10.2

  1. 下载代码:

  2. 安装依赖库:sudo apt-get install libbsd-dev

  3. 进入下载目录make

  4. 复制头文件和动态链接库

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

错误文件error.h

#include "apue.h"
#include <errno.h>      /* for definition of errno */
#include <stdarg.h>     /* ISO C variable aruments */

static void err_doit(int, int, const char *, va_list);

/*
 * Nonfatal error related to a system call.
 * Print a message and return.
 */
void err_ret(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
}

/*
 * Fatal error related to a system call.
 * Print a message and terminate.
 */
void err_sys(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    exit(1);
}

/*
 * Fatal error unrelated to a system call.
 * Error code passed as explict parameter.
 * Print a message and terminate.
 */
void err_exit(int error, const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, error, fmt, ap);
    va_end(ap);
    exit(1);
}

/*
 * Fatal error related to a system call.
 * Print a message, dump core, and terminate.
 */
void err_dump(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    abort();        /* dump core and terminate */
    exit(1);        /* shouldn't get here */
}


/*
 * Nonfatal error unrelated to a system call.
 * Print a message and return.
 */
void err_msg(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
}


/*
 * Fatal error unrelated to a system call.
 * Print a message and terminate.
 */
void err_quit(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
    exit(1);
}


/*
 * Print a message and return to caller.
 * Caller specifies "errnoflag".
 */
static void err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
    char    buf[MAXLINE];
   vsnprintf(buf, MAXLINE, fmt, ap);
   if (errnoflag)
       snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
         strerror(error));
   strcat(buf, "n");
   fflush(stdout);     /* in case stdout and stderr are the same */
   fputs(buf, stderr);
   fflush(NULL);       /* flushes all stdio output streams */
}
  1. 代码文件

    #include "apue.h" #include "error.h"

Unix环境高级编程(第三版) 代码编译 本文地址: 时间:2014.10.2 1. 下载代码...

4、调试工具

2.

安装libbsd-dev,否则编译会报错不通过,会提示编译threads文件夹里面的内容时报错

   2、修改 Make.defines.linux中的WKDIR=/home/xxx/apue.2e,为WKDIR=/home/user/apue.2e

Linux-Unix环境高级编程(第三版)代码编译

time.h:时间和日期

error.h 文件内容

#include "apue.h"
#include <errno.h>      /* for definition of errno */
#include <stdarg.h>     /* ISO C variable aruments */

static void err_doit(int, int, const char *, va_list);

/*
 * Nonfatal error related to a system call.
 * Print a message and return.
 */
void err_ret(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
}


/*
 * Fatal error related to a system call.
 * Print a message and terminate.
 */
void err_sys(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    exit(1);
}


/*
 * Fatal error unrelated to a system call.
 * Error code passed as explict parameter.
 * Print a message and terminate.
 */
void err_exit(int error, const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, error, fmt, ap);
    va_end(ap);
    exit(1);
}


/*
 * Fatal error related to a system call.
 * Print a message, dump core, and terminate.
 */
void err_dump(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    abort();        /* dump core and terminate */
    exit(1);        /* shouldn't get here */
}


/*
 * Nonfatal error unrelated to a system call.
 * Print a message and return.
 */
void err_msg(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
}


/*
 * Fatal error unrelated to a system call.
 * Print a message and terminate.
 */
void err_quit(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
    exit(1);
}


/*
 * Print a message and return to caller.
 * Caller specifies "errnoflag".
 */
static void err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
    char    buf[MAXLINE];
    vsnprintf(buf, MAXLINE, fmt, ap);
    if (errnoflag)
    {
        snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",
        strerror(error));
    }

    strcat(buf, "n");
    fflush(stdout);     /* in case stdout and stderr are the same */
    fputs(buf, stderr);
    fflush(NULL);       /* flushes all stdio output streams */
}

 

6.《计算机编程艺术》
推荐理由:算法大师得呕心沥血之作。计划出版五卷书,目前好像已出版3卷。对算法有兴趣得可以研究一下。

4.

新建 error.h 文件
本文地址,在UNIX或Linux系统中学习C很方便。并将文件复制到/usr/include/
以后在代码中引用

#include "apue.h"
#include "error.h"

即可。

 

2.《The C programming_Language》
推荐理由:C语言之父得作品权威性毋庸置疑。虽然书籍出版时间比较老,好像也没更新,不过仍不失为经典书籍,网上有这本书得英文电子版提供下载。

3.

cd apue.3e

make

用 root 用户或者 sudo 执行以下命令:

cp ./include/apue.h /usr/include/         

cp ./lib/libapue.a /usr/local/lib/ 
cp ./lib/libapue.a /usr/lib/

 

4. UNIX环境编程

《unix环境高级编程·第三版》源代码编译及使用

《unix环境高级编程》中有很多示例代码需要包含作者自定义的头文件,如"apue.h"。这些代码可以从以下网址下载

 

4)C版本的问题:

   1、解压至/home/user/目录下

1)C语言声明:
C语言的声明确实让我觉得恐怖,比较晦涩难懂,而且声明的形式和使用的形式还类似。比如如下的声明恐怕就连很多熟悉C多年的程序员也不是一眼就能看出来的: char * const * ;
那么有没有一种好的记忆方法或规则来搞清楚呢,好像没有,如果有的话也不是这样折磨人了。不过可以看看《C专家编程》第三章的内容,或许你会有所收获。
也只能多学多练了,所谓熟能生巧嘛,希望这个问题不要在你的心灵上留下阴影。

   6、编译成功。

Unix环境编程,你应该着重IO和进程两大块内容。

   3、然后再进入apue.2e目录下的std目录,打开linux.mk,将里面的nawk全部替换为awk,可以使用这个命令 :%s/nawk/awk/g 

5.《unix环境高级编程》

   4、把 /home/limeng/apue.2e/inlcude目录下的 apue.h 文件最后添加一行 #include "error.c",将该文件拷贝到/usr/include 目录中。

make工具会读取一个包含指令的文件(这个文件的名字通常都是 makefile 或 Makefile,不过后文中我们统一称之为 “makefile”),并执行各种操作来编译程序。

    最近在学习UNIX的编程,用的书是《UNIX环境高级编程》,看到书中有很有实例,我用的操作系统是RadHat,照着书把程序清单输入后编译却通不过,显示的错误是没有“apue.h头文件”。这下对我这只菜鸟来说就是当头一棒,这不坑爹吗?就照着书把程序再抄了一遍,发现出现同样的问题,这下引起我的思考。原来apue.h是作者自己写的一个文件,包含了常用的头文件,系统不自带。其中包含了常用的头文件,以及出错处理函数的定义。需要自己去配置这样的头文件,特将解决的方法总结如下:


“公欲善其事,必先利其器”。编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具。

  1     #ifndef _APUE_H     
  2     #define _APUE_H     
  3         
  4     #define _XOPEN_SOURCE   600  /* Single UNIX Specification, Version 3 */     
  5         
  6     #include <sys/types.h>       /* some systems still require this */     
  7     #include <sys/stat.h>     
  8     #include <sys/termios.h>     /* for winsize */     
  9     #ifndef TIOCGWINSZ     
 10     #include <sys/ioctl.h>     
 11     #endif     
 12     #include <stdio.h>     /* for convenience */     
 13     #include <stdlib.h>    /* for convenience */     
 14     #include <stddef.h>    /* for offsetof */     
 15     #include <string.h>    /* for convenience */     
 16     #include <unistd.h>    /* for convenience */     
 17     #include <signal.h>    /* for SIG_ERR */     
 18         
 19         
 20     #define MAXLINE 4096               /* max line length */     
 21         
 22     /*  
 23      * Default file access permissions for new files.  
 24      */    
 25     #define FILE_MODE   (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)     
 26         
 27     /*  
 28      * Default permissions for new directories.  
 29      */    
 30     #define DIR_MODE    (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)     
 31         
 32     typedef void   Sigfunc(int);   /* for signal handlers */    
 33         
 34     #if defined(SIG_IGN) && !defined(SIG_ERR)     
 35     #define SIG_ERR ((Sigfunc *)-1)     
 36     #endif     
 37         
 38     #define min(a,b)     ((a) < (b) ? (a) : (b))     
 39     #define max(a,b)     ((a) > (b) ? (a) : (b))     
 40         
 41     /*  
 42      * Prototypes for our own functions.  
 43      */    
 44     char    *path_alloc(int *);              /* Figure 2.15 */    
 45     long     open_max(void);                 /* Figure 2.16 */    
 46     void     clr_fl(int, int);               /* Figure 3.11 */    
 47     void     set_fl(int, int);               /* Figure 3.11 */    
 48     void     pr_exit(int);                   /* Figure 8.5 */    
 49     void     pr_mask(const char *);          /* Figure 10.14 */    
 50     Sigfunc *signal_intr(int, Sigfunc *);    /* Figure 10.19 */    
 51         
 52     int      tty_cbreak(int);                /* Figure 18.20 */    
 53     int      tty_raw(int);                   /* Figure 18.20 */    
 54     int      tty_reset(int);                 /* Figure 18.20 */    
 55     void     tty_atexit(void);               /* Figure 18.20 */    
 56     #ifdef  ECHO    /* only if <termios.h>  has been included */     
 57     struct termios  *tty_termios(void);      /* Figure 18.20 */    
 58     #endif     
 59         
 60     void     sleep_us(unsigned int);             /* Exercise 14.6 */    
 61     ssize_t  readn(int, void *, size_t);         /* Figure 14.29 */    
 62     ssize_t  writen(int, const void *, size_t);  /* Figure 14.29 */    
 63     void     daemonize(const char *);            /* Figure 13.1 */    
 64         
 65     int      s_pipe(int *);                 /* Figures 17.6 and 17.13 */    
 66     int      recv_fd(int, ssize_t (*func)(int,    
 67                      const void *, size_t));/* Figures 17.21 and 17.23 */    
 68     int      send_fd(int, int);             /* Figures 17.20 and 17.22 */    
 69     int      send_err(int, int,    
 70                       const char *);        /* Figure 17.19 */    
 71     int      serv_listen(const char *);     /* Figures 17.10 and 17.15 */    
 72     int      serv_accept(int, uid_t *);     /* Figures 17.11 and 17.16 */    
 73         
 74     int      cli_conn(const char *);        /* Figures 17.12 and 17.17 */    
 75     int      buf_args(char *, int (*func)(int,    
 76                       char **));            /* Figure 17.32 */    
 77         
 78     int      ptym_open(char *, int);    /* Figures 19.8, 19.9, and 19.10 */    
 79     int      ptys_open(char *);         /* Figures 19.8, 19.9, and 19.10 */    
 80     #ifdef  TIOCGWINSZ     
 81     pid_t    pty_fork(int *, char *, int, const struct termios *,    
 82                       const struct winsize *);      /* Figure 19.11 */    
 83     #endif     
 84         
 85     int     lock_reg(int, int, int, off_t, int, off_t); /* Figure 14.5 */    
 86     #define read_lock(fd, offset, whence, len)     
 87                 lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))    
 88     #define readw_lock(fd, offset, whence, len)      
 89                 lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))    
 90     #define write_lock(fd, offset, whence, len)      
 91                 lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))    
 92     #define writew_lock(fd, offset, whence, len)      
 93                 lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))    
 94     #define un_lock(fd, offset, whence, len)      
 95                 lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))    
 96         
 97     pid_t   lock_test(int, int, off_t, int, off_t);     /* Figure 14.6 */    
 98         
 99     #define is_read_lockable(fd, offset, whence, len)      
100                 (lock_test((fd), F_RDLCK, (offset), (whence), (len)) == 0)    
101     #define is_write_lockable(fd, offset, whence, len)      
102                 (lock_test((fd), F_WRLCK, (offset), (whence), (len)) == 0)    
103         
104     void    err_dump(const char *, ...);        /* Appendix B */    
105     void    err_msg(const char *, ...);    
106     void    err_quit(const char *, ...);    
107     void    err_exit(int, const char *, ...);    
108     void    err_ret(const char *, ...);    
109     void    err_sys(const char *, ...);    
110         
111     void    log_msg(const char *, ...);         /* Appendix B */    
112     void    log_open(const char *, int, int);    
113     void    log_quit(const char *, ...);    
114     void    log_ret(const char *, ...);    
115     void    log_sys(const char *, ...);    
116         
117     void    TELL_WAIT(void);        /* parent/child from Section 8.9 */    
118     void    TELL_PARENT(pid_t);    
119     void    TELL_CHILD(pid_t);    
120     void    WAIT_PARENT(void);    
121     void    WAIT_CHILD(void);    
122         
123     #endif  /* _APUE_H */    

math.h:数学库

 

Unix下文本编辑器。主要靠一堆命令来编辑文本文件,学Unix编程最好熟悉并熟练使用vi编辑器。

 

目前绝大多数Unix或Lnux系统都提供CC或GCC编译器,最简单的cc命令格式如下:

apue.h内容如下:

需要注意的是,不要太纠缠于语言的细节,比如:运算符优先级与结合性的问题等。

 

5、其他工具澳门新濠3559,

   5、把 /home/limeng/apue.2e/lib目录下的 error.c 文件第一行 #include "apue.h"注释掉或者删除,也将该文件拷贝到/usr/include 目录中。

2)数组与指针:

   在下载src.tar.gz源代码的压缩包。

3.攻克C的难点

 

如果你以后编写规模较大的程序,你可能发现这个问题可能会是你最大的烦恼,而且可能会是你消耗最多调试时间的事项。

 

ANSI C库把函数分为不同的组,每个组都具有与之相关的头文件。C语言标准库相对于其他语言,比如C++,Java来说是非常短小精悍的,但首先应着重对以下库进行学习:

   然后就可以方便的使用apue.h编译《unix高级环境编程》的的程序了。

3、make工具

如果想了解完成的ANSI C库,你可以购买相关的书籍,这些书籍一般会详细介绍每个函数的用户和一些注意点。

提供一个中文的vim在线手册:

3.《C 专家编程》
推荐理由:本书可以帮助有一定经验的C程序员成为C编程方面的专家,最关键的是本书寓教于乐,让你充分享受编程的乐趣。

如 GNU make、System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同。

ctype.h:字符处理

“书是人类进步得阶梯”。学习一门新的知识,当然要选择几本适合自己得书籍,下面介绍一些我自己学习C语言使用过的书籍:

string.h:字符串处理

1、操作系统

2.学习C标准库

二、书籍篇

1.《C primer plus》
推荐理由:适合作为入门书和基本函数查询得参考资料。本书最新版为第五版,以ANSI C99为标准详细介绍了C语言。

当然在实际工作中,你可能需要一个集成编码环境或一个功能强大的图形化编辑工具。

4.《C缺陷与陷阱》
推荐理由:书中所揭示的知识能帮助您绕过C语言自身得陷阱和缺陷,减少代码中许多常见的Bug。

还有一些内存工具可以帮你查找内存泄漏或缓冲区溢出等一些问题,如:memwatch,yamd等。

语法的学习对于一个具有编程底子的来说,就很轻松了;即使你以前没有学习过其他编程语言,我相信有2个星期,你也能轻松搞定。

推荐理由:既然是UNIX环境下C编程,就不得不说说UNIX编程书籍。

2、编译工具

stdlib.h:通用工具库

最简单的调试工具:为你的程序添加打印语句,在你对程序的运行机制有了一定的了解后,你可以实用一些工具帮助你进行调试,当然你得学习一下这些工具得使用,如:dbx,gdb等。

1)vi或vim

3)指针与内存:

《Unix环境高级编程》中对Unix环境编程有着非常详细且深入的论述,而且书中有大量实用性例子程序,不过可能得花上几个月得时间,好好啃一啃了。
在扎实掌握以上内容,不代表你得C语言学习之路已经完成,相反,才刚刚开始。以后你需要用学到得知识去解决大量不同实际问题,在不断得实践过程中,你会近一步加深对C的理解。有了以上基础之后,你会发现,在实践过程中需要的其他知识,你会非常快速的掌握

学习了以上内容之后,我相信,你就可以进行unix环境编程了。不过你可能需要对操作系统理论有一点点的了解,这样学起来会比较轻松一些。

stdio.h:标准I/O库

对于这个问题,你可以参考《C缺陷与陷阱》4.5节和《C专家编程》第4,9,10章,相信你这里面的内容搞透彻,以后就不会再被这个问题搞迷惑。

如果您一直使用Windows,身边又没有多余的机器安装UNIX,则可以使用VMware、或是Vbox等安装虚拟系统。

在unix shell环境中敲入上面的代码会将hello.c程序编译成可执行文件hello。

你得特别小心该问题,最好不要在你的程序中混合使用不同版本C的特性,否则会给你带来很迷惑的问题。如果一定要用,你最好清楚自己在做什么。

cc -o hello hello.c

还有一些其他C中的难点和容易错误的地方,可以学习前人的一些经验。以下是一个c FAQ的链接地址,相信在这篇文档中有你需要的大部分问题的解决方法。

1.学习C语法

在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD、RedHat Linux、SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等。

三、过程篇

Stevens先生的《unix环境高级编程》是我竭力推荐的,也是我的案头必备(如果对网络编程有兴趣的,可以学习一下Stevens先生的《UNIX网络编程》两卷,如果觉得还不过瘾,可以再看看《TCP/IP详解》三卷)。

一、工具篇

2)Secure shell/putty
一个支持ssh协议得客户端工具,多数情况下用来连接linux系统。

大部分UNIX和Linux程序都是通过运行make来编译的。

数组与指针的关系,在标准中并没有作很详细的规定,而且好多C入门的书籍在这个问题上并没有给出很详细的说明,所以会给人造成很多误解。

编辑:操作系统 本文来源:本文地址,在UNIX或Linux系统中学习C很方便

关键词: