`
frenchleaf
  • 浏览: 39778 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

unix高级编程及unix网络编程(进程通信)编译方法

阅读更多
就是不改err_sys方法为printf,
我把代码放在/root/Desktop/unix/apue.2e
编辑源码解压生成的apue.2e文件夹下的Make.defines.linux
WKDIR=/home/var/apue.2e为/root/Desktop/unix/apue.2e
然后进入apue.2e/std 目录,编辑linux.mk。修改里面所有的nawk为awk
vim下
:%s/nawk/awk/
在/root/Desktop/unix/apue.2e下运行make

输出一堆...
结尾是
etenv1.c:4: error: ‘ARG_MAX’ undeclared here (not in a function)
make[2]: *** [getenv1.o] 错误 1
make[2]:正在离开目录 `/root/Desktop/unix/apue.2e/threadctl'
make[1]: *** [linux] 错误 1
make[1]:正在离开目录 `/root/Desktop/unix/apue.2e'
make: *** [all] 错误 2
基本没啥大错误
编辑在目录下编辑fig1.c为
#include "apue.h"
#define BUFFSIZE 4096
int main(void)
{
        int n;
        char buf[BUFFSIZE];
        while((n=read(STDIN_FILENO,buf,BUFFSIZE))>0)
                if(write(STDOUT_FILENO,buf,n)!=n)
                        err_sys("write error");
        if(n<0)
                err_sys("read error");
        exit(0);
}

然后运行
gcc fig1.c -I ./include/ -L ./lib -lapue
会生成a.out
./a.out 写啥就打印啥了
说明:
-o就不说了,不写就生成a.out
-I 指定apue.h所在的文件夹
-L 类库的目录
-l 找静态库,比如libapue.a的名称为apue
编译完成后可以用
ldd a.out看看库,是叫库吧,

ctags:
apt-get install ctags
在source目录下
ctags -R生成tags文件
在~/.vimrc文件中定义
set tags=生成的tags文件全路径
vim fig1.c后用
光标处Ctrl-]键:跳到光标所在单词的tag。Ctrl-T键:跳回原来的位置。g]键(先按g再按]):如果有同名的多个tag,可以用这两个键进行跳转,会提示选择序号



如果是《unix网络编程-卷2-进程间通信》
比如下载的源码在/root/Desktop/unpv22e/
cd /root/Desktop/unpv22e
./configure
make
vi config.h
注释掉56,57,58行
cd lib
make就成功

cd ../pipe     # build and test a simple program
[root@localhost pipe]# make pipeconf
gcc -g -O2 -D_REENTRANT -Wall   -c -o pipeconf.o pipeconf.c
gcc -g -O2 -D_REENTRANT -Wall -o pipeconf pipeconf.o ../libunpipc.a -lrt -lpthread 
../libunpipc.a(wrapunix.o): In function `Mktemp':
/root/haoning/unpv22e/lib/wrapunix.c:184: warning: the use of `mktemp' is dangerous, better use `mkstemp'
[root@localhost pipe]# ./pipeconf /tmp/
PIPE_BUF = 4096, OPEN_MAX = 1024

参考http://tieba.baidu.com/f?kz=327192705

在第三章 System V IPC里(在红帽5里测试)
svmsg里的类编译不过
[root@s121@251 svmsg]# make
gcc -g -O2 -D_REENTRANT -Wall   -c -o ctl.o ctl.c
ctl.c: In function ‘main’:
ctl.c:8: 错误:‘buf’ 的存储大小未知
ctl.c:10: 错误:‘MSG_R’ 未声明 (在此函数内第一次使用)
ctl.c:10: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
ctl.c:10: 错误:所在的函数内只报告一次。)
ctl.c:10: 错误:‘MSG_W’ 未声明 (在此函数内第一次使用)
ctl.c:18: 错误:‘ulong_t’ 未声明 (在此函数内第一次使用)
ctl.c:18: 错误:expected ‘)’ before ‘info’
ctl.c:19: 警告:格式字符串实参太少
ctl.c:8: 警告:未使用的变量 ‘buf’
make: *** [ctl.o] 错误 1

改三部分:
1.unpv22e里面的Make.defines
修改
#CFLAGS = -g -O2 -D_REENTRANT -Wall
CFLAGS = -g -O2 -D_GNU_SOURCE -D__USE_GNU -D_REENTRANT -Wall
2.代码里面的,比如ctl.c里面的Msgget方法需要修改
//msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
msqid = Msgget(IPC_PRIVATE, IPC_CREAT|0660);
3. 把所有的ulong_t改成ulong
修改后ctl.c就没错误了,其他错误还有一堆,挨个改吧,诶
把svmsg/ctl.c改成:
#include        "unpipc.h"

int
main(int argc, char **argv)
{
        int                             msqid;
        struct msqid_ds info;
        struct msgbuf   buf;

//      msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
        msqid = Msgget(IPC_PRIVATE, IPC_CREAT|0660);
        buf.mtype = 1;
        buf.mtext[0] = 1;
        Msgsnd(msqid, &buf, 1, 0);

        Msgctl(msqid, IPC_STAT, &info);
        printf("read-write: %03o, cbytes = %lu, qnum = %lu, qbytes = %lu\n", info.msg_perm.mode & 0777, (ulong) info.msg_cbytes, (ul
ong) info.msg_qnum, (ulong) info.msg_qbytes);//这里的ulong_t全改成ulong了

        system("ipcs -q");

        Msgctl(msqid, IPC_RMID, NULL);
        exit(0);
}


[root@localhost svmsg]# make
gcc -g -O2 -D_GNU_SOURCE -D__USE_GNU -D_REENTRANT -Wall    -c -o ctl.o ctl.c
gcc -g -O2 -D_GNU_SOURCE -D__USE_GNU -D_REENTRANT -Wall  -o ctl ctl.o ../libunpipc.a -lrt -lpthread 
../libunpipc.a(wrapunix.o): In function `Mktemp':
/root/haoning/unpv22e/lib/wrapunix.c:184: warning: the use of `mktemp' is dangerous, better use `mkstemp'
gcc -g -O2 -D_GNU_SOURCE -D__USE_GNU -D_REENTRANT -Wall    -c -o limits.o limits.c
limits.c: In function ‘main’:
limits.c:19: 错误:‘MSG_R’ 未声明 (在此函数内第一次使用)
limits.c:19: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
limits.c:19: 错误:所在的函数内只报告一次。)
limits.c:19: 错误:‘MSG_W’ 未声明 (在此函数内第一次使用)
make: *** [limits.o] 错误 1

继续改limits.c
#include	"unpipc.h"

#define	MAX_DATA	64*1024
#define	MAX_NMESG	4096
#define	MAX_NIDS	4096
int		max_mesg;

struct mymesg {
  long	type;
  char	data[MAX_DATA];
} mesg;

int
main(int argc, char **argv)
{
	int		i, j, msqid, qid[MAX_NIDS];

		/* 4first try and determine maximum amount of data we can send */
//	msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
	msqid = Msgget(IPC_PRIVATE, IPC_CREAT|0660);
	mesg.type = 1;
	for (i = MAX_DATA; i > 0; i -= 128) {
		if (msgsnd(msqid, &mesg, i, 0) == 0) {
			printf("maximum amount of data per message = %d\n", i);
			max_mesg = i;
			break;
		}
		if (errno != EINVAL)
			err_sys("msgsnd error for length %d", i);
	}
	if (i == 0)
		err_quit("i == 0");
	Msgctl(msqid, IPC_RMID, NULL);

		/* 4see how many messages of varying size can be put onto a queue */
	mesg.type = 1;
	for (i = 8; i <= max_mesg; i *= 2) {
	//	msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
		msqid = Msgget(IPC_PRIVATE, IPC_CREAT|0660);	
		for (j = 0; j < MAX_NMESG; j++) {
			if (msgsnd(msqid, &mesg, i, IPC_NOWAIT) != 0) {
				if (errno == EAGAIN)
					break;
				err_sys("msgsnd error, i = %d, j = %d", i, j);
				break;
			}
		}
		printf("%d %d-byte messages were placed onto queue,", j, i);
		printf(" %d bytes total\n", i*j);
		Msgctl(msqid, IPC_RMID, NULL);
	}

		/* 4see how many identifiers we can "open" */
	mesg.type = 1;
	for (i = 0; i <= MAX_NIDS; i++) {
		//if ( (qid[i] = msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT)) == -1) {

		if ( (qid[i] = msgget(IPC_PRIVATE, IPC_CREAT|0660)) == -1) {
			printf("%d identifiers open at once\n", i);
			break;
		}
	}
	for (j = 0; j < i; j++)
		Msgctl(qid[j], IPC_RMID, NULL);

	exit(0);
}

slot.c---->System V IPC .P26 第三章
#include        "unpipc.h"
int
main(int argc, char **argv)
{
        int             i, msqid;

        for (i = 0; i < 10; i++) {
        //      msqid = Msgget(IPC_PRIVATE, SVMSG_MODE | IPC_CREAT);
                msqid = Msgget(IPC_PRIVATE, IPC_CREAT|0660);
                printf("msqid = %d\n", msqid);

                Msgctl(msqid, IPC_RMID, NULL);
        }
        exit(0);
}

unpv22e/shm/svmsgread.c中

[root@122226 shm]# make
gcc -g -O2 -D_GNU_SOURCE -D__USE_GNU -D_REENTRANT -Wall    -c -o svmsgread.o svmsgread.c
svmsgread.c: In function ‘main’:
svmsgread.c:27: 错误:‘MSG_R’ 未声明 (在此函数内第一次使用)
svmsgread.c:27: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
svmsgread.c:27: 错误:所在的函数内只报告一次。)
svmsgread.c:55: 警告:格式 ‘%d’ 需要类型 ‘int’,但实参 2 的类型为 ‘s


O_RDWR替换MSG_R或者MSG_W,网上说的 O_RDWD没找到



分享到:
评论

相关推荐

    UNIX网络编程_卷2_进程间通信【第二版】源码

    UNIX网络编程----进程间通信----卷2【第二版】源码

    UNIX环境高级编程-pdf

    《UNIX环境高级编程》是一本深受程序员和系统管理员喜爱的经典之作,主要针对那些希望深入理解UNIX操作系统,并能熟练进行...无论是自学还是作为参考手册,这本书及其相关资料都能为你的UNIX编程之路提供强大的支持。

    Unix环境高级编程中英文版包括源代码

    《Unix环境高级编程》是一本深受程序员和系统管理员喜爱的经典之作,主要涵盖了在Unix操作系统环境下进行高级编程的各种技术和方法。这本书分为多个章节,详细讲解了Unix系统接口、进程管理、文件系统、网络通信等...

    Unix高级编程(带源码)

    在CHM文件`apue2.chm`中,读者可以找到关于Unix编程的详尽讲解,包括进程管理、文件I/O、网络编程、信号处理、多线程编程等核心主题。这些内容涵盖了Unix系统的各种系统调用和库函数,通过深入浅出的方式解释了如何...

    UNIX环境高级编程 第三版 随书代码

    随书附带的代码库"apue.3e"是作者为书中各章节精心设计的实例,旨在帮助读者深入理解并实践UNIX编程的核心概念。 首先,"UNIX环境高级编程"这本书详细介绍了UNIX系统的I/O操作,包括标准I/O库、低级I/O(如open、...

    unix环境编程中文第三版pdf+文中源码

    这本书涵盖了从基本的文件I/O到复杂的进程间通信,从信号处理到网络编程,从线程管理到内存管理等广泛的主题,是学习Linux或UNIX系统编程的权威指南。 该资源包含两大部分:PDF版的书籍和源码。PDF版详细阐述了各种...

    UNIX环境高级编程(中文第三版.zip

    这本书深入讲解了在Unix环境下进行系统级编程的各种技术和细节,涵盖了从基本的文件操作到复杂的进程通信等广泛主题。 在本书中,你可以了解到以下关键知识点: 1. **Unix系统概述**:了解Unix的历史、设计哲学...

    UNIX环境高级编程(清晰PDF中文第一版)

    《UNIX环境高级编程》是一本深受IT专业人士喜爱的经典著作,尤其对于那些致力于深入理解Linux操作系统以及UNIX系统的开发者和系统管理员而言,这本书具有极高的参考价值。作为“学习Linux最好的两本书之一”,它与...

    UNIX网络编程 卷2:进程间通信书中源码

    《UNIX网络编程 卷2:进程间通信》是著名计算机科学家W. Richard Stevens的经典之作,这本书深入探讨了在UNIX系统中实现进程间通信(IPC)的各种技术和方法。源码是作者为了配合书中的理论讲解而提供的实践示例,...

    UNIX网络编程 卷1和2(第2/3版)、计算机网络(第7版 谢希仁)- 课 本和答案(共5本网络书籍大礼包)

    共5本电子书:(超值大礼包) unix网络编程第2版(1 2卷).pdf UNIX网络编程卷1:套接字联网...UNIX网络编程 卷2:进程间通信(第2版).pdf 计算机网络(第七版)复习题答案与课本对应.doc 计算机网络(第7版)-谢希仁.pdf

    UNIX环境高级编程(第2版)源码+编译步骤

    这本书是学习UNIX系统编程的经典之作,涵盖了进程控制、文件I/O、网络通信等核心主题。源码的分析与编译对于理解这些概念至关重要。 首先,我们需要解压`src.tar.gz`文件,这是包含《UNIX环境高级编程》(第2版)源...

    UNIX环境高级编程

    《UNIX环境高级编程》是一本深入探讨UNIX操作系统编程技术的经典著作。这本书主要针对有经验的程序员,旨在帮助他们理解和利用UNIX系统提供的各种服务,从而更高效地进行软件开发。书中涵盖了从基本的文件I/O到复杂...

    UNIX网络编程随书源代码(包含卷一卷二)

    2. **进程间通信**:阐述UNIX系统下的管道、消息队列、共享内存、信号量和套接字等多种IPC机制,以及它们在网络编程中的应用。 3. **异步I/O**:讲解如何使用非阻塞I/O和异步事件通知,如SIGIO和SIGALRM信号,以及 ...

    UNIX环境高级编程(英文第2版与源代码)

    该书的英文第二版提供了完整的源代码,这对于学习和实践Unix编程技巧极具价值。 首先,我们要明确“UNIX环境高级编程”这个主题涵盖的知识点非常广泛,它包括但不限于以下几个方面: 1. **Unix系统调用**:Unix...

    unix知识详解以及高级编程

    在深入探讨Unix知识详解以及高级编程这一主题之前,先让我们明确一下Unix系统的基本概念。Unix是一种多用户、多任务的操作系统,由贝尔实验...提供的"UNIX高级编程"文档应该会涵盖这些内容,是学习Unix编程的宝贵资源。

    UNIX高级编程

    《UNIX高级编程》是Linux编程领域的一本经典之作,它主要涵盖了UNIX系统中高级编程的各种技术和实践。这本书的第三版,对于深入理解UNIX系统的工作原理和编写高效、可靠的UNIX/Linux程序有着极大的帮助。以下是该书...

    unix环境高级编程英文第二版mobi(kindle资源)

    《Unix环境高级编程》是Unix系统编程领域的一本经典之作,尤其对于想要深入理解Unix操作系统以及如何在该环境下进行高效编程的开发者来说,这是一本不可或缺的参考书。英文第二版进一步更新和完善了第一版的内容,...

    UNIX环境高级编程高清版和源代码

    这本书不仅涵盖了基本的编程接口,还涉及到了进程控制、文件系统、网络通信等多个核心领域,为读者提供了一个全面而深入的UNIX编程指南。 在UNIX环境中,高级编程主要涉及以下几个关键知识点: 1. **进程管理**:...

    unix 环境高级编程中

    在《UNIX环境高级编程》这一经典著作中,作者深入探讨了在UNIX操作系统上进行系统级编程的各种技术与概念。这本书是为那些希望深入了解UNIX系统工作原理,并能够编写高效、可靠的系统级程序的开发者准备的。以下是...

    Linux/UNIX系统编程手册源码

    《Linux/UNIX系统编程手册》是一本权威的指南,涵盖了操作系统的核心编程接口,为开发者提供了深入理解操作系统底层机制的窗口。源码分析是学习这些概念的最直接方式,因为它们揭示了内核如何与应用程序交互。以下是...

Global site tag (gtag.js) - Google Analytics