linux线程(pthread)编程中的segmentation fault!!
来源:互联网 发布:php socket例子 编辑:程序博客网 时间:2024/05/22 08:23
linux线程(pthread)编程中的segmentation fault!!
Posted on 星期五, 3月 27th, 2009 at 10:28 下午
源文来自http://www.isongzi.com/2009/03/27/pthread-segmentation-fault/
继socket bad addres 错误之后,在创建线程【pthread_create()】的时候又出现了 segmentation fault。
错误语句如下:
pthread_create(&dec_tid,NULL, (void *)&encode, (void *)&cmd);
encode 声明如下:
int encode(void *arg);
开始我想的是,会不会是encode前面不用加&呢?按照声明定义:
pthread_create(&tid, &attr, (void *)myfunction, myarg);
第三个参数就是函数名而已,是为了表明线程函数的入口地址。但是,看的freescale提供的参考程序中有源码是这样的:
pthread_create(&sigtid, NULL, (void *)&signal_thread, NULL);
也就是说,可以把第三个参数也即函数名前面加上&,两个效果一样。为了检验到底什么地方错误,还是改了一下:
pthread_create(&dec_tid,NULL, (void *)encode, (void *)&cmd);
把encode前面 的&去掉,但是依然segmentation fault.。
网上找了一下,原因在于调试的时候没加 -lpthread!想要编译多线程的程序,必须如下编译:
gcc -o test -lpthread test.c,
因为线程库不是内核自带的,要显式说明。问题是,为什么GCC在编译的时候不报错呢?
这个问题比较有难度。好了,原因找到了,怎么解决?Makefile 文件如下:
#This Makefile is from http://isongzi.com which is to make send.out
CC=$(CROSS_COMPILE)gcc
LINK=$(CROSS_COMPILE)gcc
CROSS_COMPILE=arm-926ejs-linux-
OBJ = main.o /
enc.o /
capture.o /
fb.o /
socket.o /
OBJDIR=./bin
LIBNAME = libvpu.a
LIBDIR = ./lib/
# list of platforms which want this test case
INCLUDE_LIST:=IMX27ADS IMX31ADS MXC30031ADS IMX27MDK27V0
TARGET = send.out
all: $(TARGET) $(TARGET1)
$(TARGET): $(LIBDIR)$(LIBNAME) $(OBJ)
$(LINK) -L . -lpthread -o $(TARGET) $(OBJ) $(LIBNAME)
mkdir -p $(OBJDIR)
mv $(TARGET) $(OBJDIR)
mv $(LIBNAME) $(OBJDIR)
%.o: %.c
$(CC) -Wall -O2 -I $(LIBDIR) -c $^ -o $@
$(LIBDIR)$(LIBNAME):
make -C $(LIBDIR)
mv $(LIBDIR)$(LIBNAME) .
.PHONY: clean
clean:
rm -f $(OBJDIR)/$(TARGET) $(OBJ) $(LIBNAME)
原来,Makefile 里面加了 -lpthread啊,注意“lpthread” !
到底哪里出问题了?待解。。
附:关于segmentation fault 的其他错误,请参考这里。
注:问题稀里糊涂地解决了。把Makefile中
$(LINK) -L . -lpthread -o $(TARGET) $(OBJ) $(LIBNAME)
改为:$(LINK) -o $(TARGET) -lpthread $(OBJ) $(LIBNAME)
其中,-lpthread 就相当于 /usr/lib/libpthread.a 这是unix编程的时候简单的做法。当然,如果有动态链接库的话,也代表相应的动态链接库。-lxxx =/usr/lib/libxxx.a 或者=/usr/lib/libxxx.so
另外,-L表示搜索库的位置。-L . 表示在当前位置搜索相应的库。
问题是,修改之前能编译、链接成功啊,两句不同之处就在于把-lpthread 放在了不同的位置,而已。。。
- linux线程(pthread)编程中的segmentation fault!!
- linux开发中的Segmentation fault的解析
- Segmentation fault in Linux
- linux segmentation fault记录
- Linux遭遇Segmentation fault
- Linux下报错:Segmentation fault.
- Segmentation fault in Linux
- linux编程中遇到的Segmentation fault错误
- [转载]Segmentation fault in Linux
- Linux C程序:Segmentation fault
- [Linux] yum提示Segmentation fault
- Linux段错误(Segmentation fault)
- segmentation fault(linux c)补遗
- UNIX/LINUX编程学习之线程pthread
- Android编程之ActivityManager: Segmentation fault
- Segmentation Fault
- Segmentation Fault
- Segmentation fault
- Windows XP 安装 GT4.0.2
- Activity生命周期方法
- 如何用.Net 取得指定网面的内容? How to get html web page data?
- WinCE 流接口驱动中设备句柄的传输过程
- myclipes+tomcat6+mysql5(linux)环境下tomcat启动应用出现死循环
- linux线程(pthread)编程中的segmentation fault!!
- typedef和define具体的详细区别
- 春节休假只有7天
- alsa驱动分析之一
- 已解决:Linux中用socket实现视频、音频的同步传输
- ARM指令集和X86指令集的比较
- [MySQL 5.1 体验]MySQL 事件调度器(Event Scheduler)
- Jsp中实现文件下载
- alsa驱动分析之二