Chinaunix

标题: 学习过《UNIX环境高级编程》的请进 [打印本页]

作者: karl412    时间: 2005-11-16 10:30
标题: 学习过《UNIX环境高级编程》的请进
参见《UNIX环境高级编程》的15-1程序
参见《UNIX环境高级编程》的14-3程序

其中涉及到
static int fd[2];//在程序15-1中定义为int fd[2];

if( write(fd[0], line, n) != n)
        err_sys("write error to pipe");

这一段程序代码
我编译成功 不过在运行程序的时候
总是出现:
(testback@qsd)>output
12 34
write error to pipe: Bad file number

这样的错误

请大家告诉我解决方法^_^
作者: ernestliu_nk    时间: 2005-11-16 11:16
标题: 您也在看APUE呀,老兄帮我一下呀!!!
我把APUE的随书代码找到,认真的读了README,生成Make.defines,把libmisc.a 的路径改了,可是在
lib.svr4中make死循环,我该怎么办,帮我呀!!  谢谢先。

我的系统是RH 8.0
作者: karl412    时间: 2005-11-16 13:03
-_-!

先喊你一声大哥
然后再告诉你 我是每个程序都是手工敲进电脑
自己写Makefile 然后实现验证程序正误的

至于你的问题 我不能帮你 你最好发个帖子问问哈
作者: amoyppa    时间: 2005-11-16 13:18
顺带问一声楼主:
第一个例子P2的那个ls你是怎么通的?
                     程序1-1列出一个目录所有的文件
#include <sys/types.h>
#include <dirent.h>
#include "ourhdr.h"
........
我找了这个书的例子的源码,这个ourhdr.h有这样一个文件,怎么编译过去啊?是不是应该还有一个ourhdr.c这样的文件(这个文件没有找到)。
我gcc提示我先编译头文件。可是没有ourhdr.c啊?
作者: karl412    时间: 2005-11-16 13:39
原帖由 amoyppa 于 2005-11-16 13:18 发表
顺带问一声楼主:
第一个例子P2的那个ls你是怎么通的?
                     程序1-1列出一个目录所有的文件
#include <sys/types.h>
#include <dirent.h>
#include "ourhdr.h"
我找了这个书的例子的源码,这个ourhdr.h有这样一个文件,怎么编译过去啊?是不是应该还有一个ourhdr.c这样的文件(这个文件没有找到)。
我gcc提示我先编译头文件。可是没有ourhdr.c啊?


请你看看代码中含有"err_"开头的一类函数 看到了没有?
这个只是在ourhdr.h中声明了函数原型,并没有给出定义
给出定义的是error.c这个文件----很多目录下有^_^

我给你的建议:是把error.c更改名称为error.h
以后在你的程序中包含error.h这个头文件就可以了^_^
顺带提醒你 如果error.h不在根目录 记得在编译参数中加 -I[pathname]

----------------------------------------------------------------------
-_-! 我自己的是手工敲进去的 用了三天 终于敲到15章了 好累!
作者: ernestliu_nk    时间: 2005-11-16 14:18
标题: ^_^,是这样呀!!!
看来也只有这样了 !!
我在看看吧,想办法make过去,他的ourhdr.h中定义了很多函数,宏,报错信息等等,
要是搞定 Make.defines  你这次碰到的问题也就不存在了。
作者: amoyppa    时间: 2005-11-16 14:23
恩谢谢楼上的。按照你的方法搞定。
另外还有一个办法就是把err_函数替换成printf也可以。
作者: karl412    时间: 2005-11-16 14:58
原帖由 ernestliu_nk 于 2005-11-16 14:18 发表
看来也只有这样了 !!
我在看看吧,想办法make过去,他的ourhdr.h中定义了很多函数,宏,报错信息等等,
要是搞定 Make.defines  你这次碰到的问题也就不存在了。


大哥~~~~ 我的问题很可能是系统问题(如果我估计错了,请高手笑得小声一点哈 ^_^)
不是搞定Make.defines就可以搞定的吧

我刚刚看了source_code下面的README
我的理解是这样的
你把每一个子目录下面的Makefile文件的第一行
include ../Make.defines中的Make.defines改为(根据README的提示改)
你的系统所对应的
(Make.def.44 §§Make.def.sun §§ Make.def.svr4)其中的一个
我假设你把Make.defines更改成Make.def.svr4

好了

然后更改你Make.def.svr4中的LDLIBS=/home/stevens/libmisc.a这句
改成libmisc.a在你机子上面的目录
应该就可以make过去了

我没有自己试验 因为我是通过NetTerm连接到到公司的主机的
而且我联机的是AIX Version 5.1
我不知道跟 SunOS 4.1.x, SVR4, or BSD/386其中的哪一种比较接近
反正我是没有在我的根目录下找到libmisc.a这个文件
(怀疑是不是要去作者的网站上下载下来的)

祝你好运 ^_^
作者: karl412    时间: 2005-11-16 15:05
原帖由 amoyppa 于 2005-11-16 14:23 发表
恩谢谢楼上的。按照你的方法搞定。
另外还有一个办法就是把err_函数替换成printf也可以。




好想学雨丝风片大哥讲一个故事告诉你道理
可惜我不是讲故事的人啊 -_-!

把err_函数替换成printf函数实现的话
确实可以实现
不过你不知道你的出错原因是什么
不然作者就编写一个error.c
来简化了每个程序的很多代码

你认真看看书吧 ^_^
作者: karl412    时间: 2005-11-16 17:10
然后更改你Make.def.svr4中的LDLIBS=/home/stevens/libmisc.a这句
改成libmisc.a在你机子上面的目录
应该就可以make过去了


很对不起 刚刚讲错了
首先 $cp Make.def.svr4 Make.defines
其次 是修改路径名为你想存放libmisc.a的地方
修改LDFLAGS和LIB两个变量^_^

最后 在lib.svr4文件夹中运行$make systype.sh


-----------------------------------------
我已经搞定了 ^_^ 祝你好运
作者: amoyppa    时间: 2005-11-16 17:23
你们都在讲啥呢这是,没看明白。看看书先.....
作者: ernestliu_nk    时间: 2005-11-16 17:37
标题: ^_^,谢谢!!!
我也没有找到libmisc.a, ^_^

我现在也看apue,只不过我是个新手,以后多多指教。

谢谢再!!!
作者: cmh_2003    时间: 2005-11-16 20:29
关注中 我现在也在看通信这块 能把代码和抱错全贴出来吗
作者: karl412    时间: 2005-11-17 08:27
开始跟他们讲怎么生成libmisc.a库文件

原帖由 ernestliu_nk 于 2005-11-16 17:37 发表
我也没有找到libmisc.a, ^_^

我现在也看apue,只不过我是个新手,以后多多指教。

谢谢再!!!



ernestliu_nk:
libmisc.a不是找的 而是生成的
你按照我前面说的 更改我说的那两个变量名
然后make一下就可以生成了 ^_^

PS:
我跟你一样 是一个新手
我花4天看完APUE,手工敲了很多代码而已
不能给你什么指教 不过欢迎讨论 ^_^
我大四 现在在北京某软件公司实习
你要是也在北京 并且想请我饭 我也会去的 ^0^ 呵呵~~~~

--------------------------------------------------------
顺便感谢mq110和讲故事的雨丝风片大哥对我的帮助

[ 本帖最后由 karl412 于 2005-11-17 08:32 编辑 ]
作者: karl412    时间: 2005-11-17 08:29
http://bbs.chinaunix.net/viewthr ... &extra=page%3D1

读一下尊敬的FLW版主给的解决问题之道 ^_^
多利用一下论坛里以前的帖子
那里是块宝地 !
作者: ernestliu_nk    时间: 2005-11-17 09:31
标题: 回复 10楼 karl412 的帖子
systype.sh 我觉的是检测系统类型的,怎么用make  ???

我在lib.svr4中执行 make systype.sh  提示:Nothing to be done for `systype.sh`
执行 make  提示如下:
make `systype.sh`
/bin/sh: line 1: systype.sh: command not found
make[214]: Entering directory `/home/ernestliu_nk/book/APUE/apue/lib.svr4'


我的 Make.defines  是这样改的


CC=gcc
LDFLAGS=/home/ernestliu_nk/book/APUE/apue/libmisc.a
LDLIBS=$(LDFLAGS)
NOANSICOMPILE.c=$(CC) $(NOANSICFLAGS) $(CPPFLAGS) -c
LINK.c=$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS)

# Common definitions

CFLAGS  =
CFLAGSO = -O

LIB=/home/ernestliu_nk/book/APUE/apue/libmisc.a
# Our library that almost every program needs.

TEMPFILES = core core.* *.o temp.* *.out typescript*
# Common temp files to delete from each directory.



我接触linux不长时间,问题比较弱,谢谢先!!
作者: karl412    时间: 2005-11-17 10:10
原帖由 ernestliu_nk 于 2005-11-17 09:31 发表
systype.sh 我觉的是检测系统类型的,怎么用make  ???

我在lib.svr4中执行 make systype.sh  提示:Nothing to be done for `systype.sh`
执行 make  提示如下:
make `systype.sh`
/bin/sh: line 1: s ...


^_^

你直接在命令行里面运行$systype.sh
可能会出现不能运行systype.sh的字样吧

一种方法:
$chmod 777 systype.sh
$make systype.sh

另一种方法(假设你使用的是svr4)
$make svr4

---------------------------
以上方法都是基于理论的
一般上午 我在看书
下午我会写程序
如果那时还没有搞定
我和你一起探讨吧 ^_^
作者: ernestliu_nk    时间: 2005-11-17 10:48
标题: 回复 17楼 karl412 的帖子
非常感谢,我越来越喜欢linux了,^_^!!!
作者: karl412    时间: 2005-11-17 13:17
HOHO~~~~

原来几个新手在一起讨论是如此的 "嗨噼"啊~~

我是半桶水 所以摇的特别厉害 ^_^

--------------------------------
CU == see you




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2