日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux环境编程apue和unp,《APUE》和《UNP》文件的编译和使用(转载)

發布時間:2023/12/14 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux环境编程apue和unp,《APUE》和《UNP》文件的编译和使用(转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

source code中的README只提供了編譯方式,要是自己敲代碼的話,需要稍微修改一下。

1.編譯《APUE》

在那里編譯都是一樣,我們應該的是libapue.a 和apue.h文件。

我使用的目錄是/home/dan/download/apue.2e/

修改Make.defines.linux文件中,

WKDIR=/home/dan/download/apue.2e

在我的機器上編譯時,提示ARG_MAX未定義,可以這樣修改。

在apue.2e/include/apue.h中添加一行:

#define ARG_MAX 4096

打開apue.2e/threadtl/getenv1.c 和apue.2e/threadctl/getenv3.c,添加一行:

#include "apue.h"

這樣就可以編譯通過了,復制apue.2e/include/apue.h到/usr/include下,

apue.2e/lib/libapue.a 到/usr/lib/和 /usr/lib64下。

2. 使用apue.h文件和libapue.a庫。

假定/tmp下有一個文件:threadid.c,內容如下(apue線程章節的實例):

#include

#include

pthread_t ntid;

void

printids(const char *s)

{

pid_t pid;

pthread_t tid;

pid = getpid();

tid = pthread_self();

printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid,

(unsigned int)tid, (unsigned int)tid);

}

void *

thr_fn(void *arg)

{

printids("new thread: ");

return((void *)0);

}

int

main(void)

{

int err;

err = pthread_create(&ntid, NULL, thr_fn, NULL);

if (err != 0)

err_quit("can't create thread: %s\n", strerror(err));

printids("main thread:");

sleep(1);

exit(0);

}

使用如下命令編譯:

cc -o threadid threadid.c -lapue -lpthread

可以運行一下:

dan@dan-laptop:/tmp$ ./threadid

new thread: pid 17490 tid 816015696 (0x30a36950)

main thread: pid 17490 tid 823949040 (0x311c76f0)

3. 編譯《UNP》

這個稍微麻煩些。

我們首先造成一個目錄,以后自己的代碼就敲在這個目錄里。

mkdir /home/dan/study/unp

仍然是下載到/home/dan/download/,解壓縮,進入目錄

cd /home/dan/download/unpv13e/

README文件中說的很具體:

========================================

Execute the following from the src/ directory:

./configure # try to figure out all implementation differences

cd lib # build the basic library that all programs need

make # use "gmake" everywhere on BSD/OS systems

cd ../libfree # continue building the basic library

make

cd ../libroute # only if your system supports 4.4BSD style routing sockets

make # only if your system supports 4.4BSD style routing sockets

cd ../libxti # only if your system supports XTI

make # only if your system supports XTI

cd ../intro # build and test a basic client program

make daytimetcpcli

========================================

這里只編譯lib下的文件,這樣可以產生libunp.a,復制這個靜態庫到/usr/lib/和/usr/lib64/

如果提示:

unp.h:139: error: conflicting types for ‘socklen_t’

/usr/include/bits/socket.h:35: error: previous declaration of ‘socklen_t’ was here

需要注解掉當前目錄中unp.h的第139行。

復制libunp.a到系統目錄:

root@dan-laptop:/home/dan/download/unpv13e/lib# cp ../libunp.a /usr/lib

root@dan-laptop:/home/dan/download/unpv13e/lib# cp ../libunp.a /usr/lib64/

4.使用unp.h和libunp.a

如果直接復制unpv13e/lib/unp.h到/usr/include,那么在別的目錄編譯書上代碼時,很可會受到類似上面的錯誤:

In file included from daytimetcpsrv1.c:1:

/usr/include/unp.h:227: error: redefinition of ‘struct sockaddr_storage’

In file included from daytimetcpsrv1.c:1:

/usr/include/unp.h:249:30: error: ../lib/addrinfo.h: No such file or directory

/usr/include/unp.h:263: error: redefinition of ‘struct timespec’

/usr/include/unp.h:363: error: conflicting types for ‘gai_strerror’

/usr/include/netdb.h:647: error: previous declaration of ‘gai_strerror’ was here

/usr/include/unp.h:367: error: conflicting types for ‘getnameinfo’

/usr/include/netdb.h:653: error: previous declaration of ‘getnameinfo’ was here

/usr/include/unp.h:371: error: conflicting types for ‘gethostname’

/usr/include/unistd.h:857: error: previous declaration of ‘gethostname’ was here

/usr/include/unp.h:387: error: conflicting types for ‘inet_ntop’

/usr/include/arpa/inet.h:65: error: previous declaration of ‘inet_ntop’ was here

/usr/include/unp.h:395: error: conflicting types for ‘pselect’

/usr/include/sys/select.h:121: error: previous declaration of ‘pselect’ was here

daytimetcpsrv1.c: In function ‘main’:

daytimetcpsrv1.c:9: error: ‘MAX_LINE’ undeclared (first use in this function)

daytimetcpsrv1.c:9: error: (Each undeclared identifier is reported only once

daytimetcpsrv1.c:9: error: for each function it appears in.)

dan@dan-laptop:~/study/unp/4$ rm -f /usr/include/unp.h

解決方法有點傻:

進入我們起初時建立的目錄:

cd /home/dan/study/unp

復制config.h和unp.h到此目錄:

dan@dan-laptop:~/study/unp$ cp /home/dan/download/unpv13e/config.h .

dan@dan-laptop:~/study/unp$ cp /home/dan/download/unpv13e/lib/unp.h .

修改unp.hunp和apue閱讀順序unp和apue閱讀順序,

#include "../config.h"改成 #include "config.h"

添加一行:

#define MAX_LINE 2048

練習書上代碼時,在unp目錄下創建相應的章節目錄,文件中添加一行:

#include "../unp.h"

編譯時鏈接unp庫就可以了。

以第四章的daytimetcpsrv1.c為例:

dan@dan-laptop:~/study/unp/4$ pwd

/home/dan/study/unp/4

dan@dan-laptop:~/study/unp/4$ cat daytimetcpsrv1.c

#include "../unp.h"

#include

int main(int argc, char **argv)

{

int listenfd, connfd;

socklen_t len;

struct sockaddr_in servaddr, cliaddr;

char buff[MAX_LINE];

time_t ticks;

listenfd = Socket(AF_INET, SOCK_STREAM, 0);

bzero(&servaddr, sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(13);

Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));

Listen(listenfd, LISTENQ);

for (;;) {

len = sizeof(cliaddr);

connfd = Accept(listenfd, (SA *)&cliaddr, &len);

printf("connection from %s, port %d\n",

Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),

ntohs(cliaddr.sin_port));

ticks = time(NULL);

snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

Write(connfd, buff, strlen(buff));

Close(connfd);

}

}

編譯:

cc -o daytimetcpsrv1 daytimetcpsrv1.c -lunp

運行一下:

root@dan-laptop:/home/dan/study/unp/4# ./daytimetcpsrv1 &

[1] 22106

root@dan-laptop:/home/dan/study/unp/4#

root@dan-laptop:/home/dan/study/unp/4# ./daytimetcpcli

usage: a.out

root@dan-laptop:/home/dan/study/unp/4# ./daytimetcpcli 127.0.0.1

connection from 127.0.0.1, port 42064

Fri Aug 21 23:03:56 2009

root@dan-laptop:/home/dan/study/unp/4# netstat -nt

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 127.0.0.1:13 127.0.0.1:42064 TIME_WAIT

本文來自電腦雜談,轉載請注明本文網址:

http://www.pc-fly.com/a/jisuanjixue/article-124071-1.html

總結

以上是生活随笔為你收集整理的linux环境编程apue和unp,《APUE》和《UNP》文件的编译和使用(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。