三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记

一:移植Boa(web服务器)到嵌入式Linux系统

 

一、Boa程序的移植

1、下载Boa源码
    下载地址: http://www.boa.org/
    目前最新发行版本: 0.94.13   (几年没更新版本了)
    下载 boa-0.94.13.tar.gz,

注意:若从boa上下载的是boa-0.94.13.tar.tar,解压方式一样
    解压:

 

2、生成Makefile文件
   进入boa-0.94.13,直接运行src/configure文件

[tekkamanninja@Tekkaman-Ninja src]$./configure

 

3、修改Makefile文件(注意:必须用cross-2.95.3, 如使用3.4.1、4.1.1等等会出错) 4、交叉编译

[tekkamanninja@Tekkaman-Ninja src]$ make

 

5、去除调试信息,减小体积。(可选)

[tekkamanninja@Tekkaman-Ninja src]$/home/tekkamanninja/working/source/2.95.3/bin/arm-linux-strip boa

 

6、将编译好的程序放入根文件系统的/bin目录下。

[tekkamanninja@Tekkaman-Ninja src]$ cp boa/home/tekkamanninja/working/nfs/rootfs/bin/

  

 

 

二、配置Boa

Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改。

 

1、Group的修改

修改 Group nogroup
为 Group user(开发板上有的组)
修改 User nobody
为 User boa (user组中的一个成员)

根据你的开发板的情况设定。一定要存在的组和用户。

 

以下是我在开发板上的操作:

[root@~]#adduser -g user boa
Changing password for boa
Enter the new password (minimum of 5, maximum of 8 characters)
Please use a combination of upper and lower case letters and numbers.
Enter new password:
Bad password: too short.

Warning: weak password (continuing).
Re-enter new password:
passwd[820]: password for `boa' changed by user `root'
Password changed.
[root@~]#

2、ScriptAlias的修改

修改 ScriptAlias /cgi-bin/  /usr/lib/cgi-bin/
为 ScriptAlias /cgi-bin/  /var/www/cgi-bin/

这是在设置CGI的目录,你也可以设置成别的目录。比如用户文件夹下的某个目录。

3、ServerName的设置

修改 #ServerName www.your.org.here
为 ServerName www.your.org.here

注意:该项默认为未打开,执行Boa会异常退出,提示“gethostbyname::No such file or directory”,所以必须打开。其它默认设置即可。你也可以设置为你自己想要的名字。比如我设置为:ServerName tekkaman2440

此外,还需要:

将mime.types文件复制/etc目录下,通常可以从linux主机的 /etc目录下直接复制即可。

(以下配置和boa.conf的配置有关)

创建日志文件所在目录/var/log/boa

创建HTML文档的主目录/var/www

创建CGI脚本所在录 /var/www/cgi-bin

 

[tekkamanninja@Tekkaman-Ninja log]$ mkdir -m 777 boa
[tekkamanninja@Tekkaman-Ninja log]$ cd ..
[tekkamanninja@Tekkaman-Ninja var]$ mkdir -m 777 www
[tekkamanninja@Tekkaman-Ninja var]$ mkdir -m 777 www/cgi-bin
[tekkamanninja@Tekkaman-Ninja var]$ cd ..
[tekkamanninja@Tekkaman-Ninja rootfs]$ cp /etc/mime.types etc/

 

三、运行Boa

开发板操作:

[root@~]#boa

如果发现boa没有运行,则可以在开发板的/var/log/boa/error_log文件中找原因。

比如端口已被其他程序占用:

[root@~]#cat /var/log/boa/error_log
[20/Feb/2008:21:21:57 +0000] boa.c:194 - unable to bind: Address already in use

 

或是用户设置错误等等,都可以查到。

 

 

四、功能测试

静态网页测试

将静态网页存入根文件系统的/var/www目录下(可以将主机 /usr/share/doc/HTML/目录下的index.html、homepage.css和img、stylesheet-images目录复制到/var/www目录下)

我参考《嵌入式Web服务器移植 》的做法如下:

在根文件系统的/var目录下

[tekkamanninja@Tekkaman-Ninja var]$ cp /usr/share/doc/HTML/index.html www/
[tekkamanninja@Tekkaman-Ninja var]$ cp -r /usr/share/doc/HTML/img www/
[tekkamanninja@Tekkaman-Ninja var]$ cp /usr/share/doc/HTML/homepage.css www/
[tekkamanninja@Tekkaman-Ninja var]$ cp -r/usr/share/doc/HTML/stylesheet-images www/

 

直接在浏览器中输入开发板的IP地址(比如我的是http://192.168.1.2) ,出现fedora的欢迎网页。静态HTML调试成功。

CGI功能测试

1、编写HelloworldCGI.c程序

[tekkamanninja@Tekkaman-Ninja source]$ vi helloworldCGI.c

(主程序的程序开头一定要用Tab,而不是空格,不然编译可能不通过)

 

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
        printf("Content-type: text/html\n\n");
        printf("\n");
        printf("\n");
        printf("\n");
        printf("

Hello,world.

\n");
        printf("\n");
        printf("\n");
        exit(0);
}

 

 

2.交叉编译生成CGI程序

 

[tekkamanninja@Tekkaman-Ninja source]$/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc-o helloworldCGI helloworldCGI.c

 

将helloworldCGI 拷贝至根文件系统的/var/www/cgi-bin/下

 

[tekkamanninja@Tekkaman-Ninja source]$ cp helloworldCGI../nfs/rootfs/var/www/cgi-bin/

 

3.测试

浏览器输入
   http://192.168.1.2/cgi-bin/helloworldCGI

网页出现 Hello,world. 调试成功!

 

[tekkamanninja@Tekkaman-Ninja src]$ cd ../..
[tekkamanninja@Tekkaman-Ninja source]$ cd ../nfs/rootfs/etc/
[tekkamanninja@Tekkaman-Ninja etc]$ mkdir boa
[tekkamanninja@Tekkaman-Ninja etc]$ chmod 777 boa/
[tekkamanninja@Tekkaman-Ninja etc]$ cd boa
[tekkamanninja@Tekkaman-Ninja boa]$ kwrite boa.conf

 

CC = /home/tekkamanninja/working/source/2.95.3/bin/arm-linux-gcc 
CPP = /home/tekkamanninja/working/source/2.95.3/bin/arm-linux-gcc -E

 

 

[tekkamanninja@Tekkaman-Ninja source]$tar xzf boa-0.94.13.tar.gz


 

 

二:移植lighttpd Web服务器到嵌入式linux系统

 

一、下载并解压
下载的官方主页:www.lighttpd.net
我下的是目前最新的lighttpd-1.4.18
解压:
[tekkamanninja@Tekkaman-Ninja source]$ tar xjvf lighttpd-1.4.18.tar.bz2

二、配置和交叉编译
[tekkamanninja@Tekkaman-Ninja source]$ cd lighttpd-1.4.18
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ CC=/home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc ./configure -prefix=/lighttpd  -host=arm-9tdmi-linux-gnu --disable-FEUTARE -disable-ipv6 -disable-lfs  

这里特别注意一下:-prefix=/lighttpd , 我是将软件先装在Host的根目录下的lighttpd文件夹内,然后将其复制到开发板的根文件系统的根目录下。我之所以这样做是因为这个软件在make install时会配置他私有的库文件的路径,在开发板运行时会在-prefix= 的文件加下找他的私有库文件。而我又是交叉编译给开发板,这样配置比较方便移植。

--disable-FEUTARE -disable-ipv6 -disable-lfs 可以不加。

[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ make

三、程序安装
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ make install

拷贝配置文件到开发板根文件系统的etc文件夹并进行适当修改:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp doc/lighttpd.conf  /home/tekkamanninja/working/nfs/rootfs/etc/

[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ kwrite  /home/tekkamanninja/working/nfs/rootfs/etc/lighttpd.conf 

必需修改的地方有:

    server.document-root        = "/srv/www/htdocs/"
改为server.document-root        = "/home/lighttpd/html/"

你可以自己定义,这里就是设置web服务的根目录。

屏蔽一下语句,不然嵌入式这样的小系统下可能无法启动
#$HTTP["url"] =~ "\.pdf$" {
#  server.range-requests = "disable"
#}

开看程序需要那些动态库:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d src/lighttpd

Dynamic section at offset 0x20790 contains 21 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libdl.so.2]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0xc200
 0x0000000d (FINI)                       0x231c0
 0x00000004 (HASH)                       0x8128
 0x00000005 (STRTAB)                     0xa338
 0x00000006 (SYMTAB)                     0x8b48
 0x0000000a (STRSZ)                      5946 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x30860
 0x00000002 (PLTRELSZ)                   960 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0xbe40
 0x00000011 (REL)                        0xbe00
 0x00000012 (RELSZ)                      64 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0xbd70
 0x6fffffff (VERNEEDNUM)                 2
 0x6ffffff0 (VERSYM)                     0xba72
 0x00000000 (NULL)                       0x0

拷贝动态库:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libdl-2.3.2.so~/working/nfs/rootfs/lib/
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cp ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libdl.s*  ~/working/nfs/rootfs/lib/

在开发板为此程序新建一个用户及存储网页的根目录以及一个log目录:

开发板操作:
[root@~]#adduser -g user lighttpd
Changing password for lighttpd
Enter the new password (minimum of 5, maximum of 8 characters)
Please use a combination of upper and lower case letters and numbers.
Enter new password:
Bad password: too short.

Warning: weak password (continuing).
Re-enter new password:
passwd[786]: password for `lighttpd' changed by user `root'
Password changed.
[root@~]#

HOST 操作:
[tekkamanninja@Tekkaman-Ninja lighttpd-1.4.18]$ cd ../../nfs/rootfs/home/lighttpd/
[tekkamanninja@Tekkaman-Ninja lighttpd]$ su
口令:
[root@Tekkaman-Ninja lighttpd]# mkdir html
[root@Tekkaman-Ninja lighttpd]# chmod 777 html/
[root@Tekkaman-Ninja lighttpd]# mkdir  ../../var/log/lighttpd
[root@Tekkaman-Ninja lighttpd]# chmod 777 ../../var/log/lighttpd

将移植好的程序(整个目录,其中包含了bin、sbin、lib和share目录)拷贝到开发板根文件系统的根目录下:
[root@Tekkaman-Ninja lighttpd]# mv /lighttpd   /home/tekkamanninja/working/nfs/
[root@Tekkaman-Ninja lighttpd]# exit
exit

四、运行程序

在开发板上操作:

[root@~]#/lighttpd/sbin/lighttpd -f /etc/lighttpd.conf

将测试静态网页放在server.document-root设置的目录下,并在HOST的浏览器下输入开发板IP,测试通过。

至于CGI的运行,我还不懂配置,有空再研究!

 

 

三:移植shttpd Web服务器到嵌入式Linux系统

 

一、下载并解压
下载的官方主页:http://shttpd.sourceforge.net/
我下的是目前最新的shttpd-1.39.tar.gz
解压:
[tekkamanninja@Tekkaman-Ninja source]$ tar zxvf shttpd-1.39.tar.gz

 

二、配置和交叉编译
[tekkamanninja@Tekkaman-Ninja source]$ cd shttpd-1.39  
[tekkamanninja@Tekkaman-Ninja shttpd-1.39]$ cd src/
[tekkamanninja@Tekkaman-Ninja src]$ kwrite Makefile

 

只需在前面加上交叉编译器路径就好:
CC = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-gcc
AR = /home/tekkamanninja/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-ar
CFLAGS =  -DNO_SSL

 

加上CFLAGS =  -DNO_SSL,是因为如果编译SSL支持,会因符号未定义而无法通过。所以我去除了SSL 支持。

 

交叉编译:

[tekkamanninja@Tekkaman-Ninja src]$ make unix

开看程序需要那些动态库:
[tekkamanninja@Tekkaman-Ninja src]$ ~/working/gcc4.1.1/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-readelf -d shttpd

Dynamic section at offset 0x12cc8 contains 20 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x9180
 0x0000000d (FINI)                       0x18708
 0x00000004 (HASH)                       0x8128
 0x00000005 (STRTAB)                     0x8a5c
 0x00000006 (SYMTAB)                     0x843c
 0x0000000a (STRSZ)                      807 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x22d90
 0x00000002 (PLTRELSZ)                   704 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x8ec0
 0x00000011 (REL)                        0x8e88
 0x00000012 (RELSZ)                      56 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x8e48
 0x6fffffff (VERNEEDNUM)                 1
 0x6ffffff0 (VERSYM)                     0x8d84
 0x00000000 (NULL)                       0x0


将编译好的程序放入开发板的文件系统下:
[tekkamanninja@Tekkaman-Ninja src]$ cp shttpd /home/tekkamanninja/working/nfs/rootfs/sbin/

 

三、运行shttpd

因为shttpd 没有配置文件,所以配置是由启动参数加的,比如我在开发板中操作如下:
[root@~]#shttpd -root /var/www -ports 80  &

意思是Web 根目录为/var/www 用80端口提供服务。

 

还有别的参数如下:
[root@~]#shttpd --help
SHTTPD version 1.39 (c) Sergey Lyubka
usage: shttpd [options] [config_file]
  -A <htpasswd_file>
  -root         Web root directory (default: .)
  -index_files  Index files (default: index.html,index.htm,index.php,index.cgi)
  -ports        Listening ports (default: 80)
  -dir_list     Directory listing (default: 1)
  -cfg_uri      Config uri
  -protect      URI to htpasswd mapping
  -cgi_ext      CGI extensions (default: cgi,pl,php)
  -cgi_interp   CGI interpreter
  -cgi_env      Additional CGI env vars
  -ssi_ext      SSI extensions (default: shtml,shtm)
  -auth_realm   Authentication domain name (default: mydomain.com)
  -auth_gpass   Global passwords file
  -auth_PUT     PUT,DELETE auth file
  -access_log   Access log file
  -error_log    Error log file
  -mime_types   Additional mime types list
  -aliases      Path=URI mappings
  -acl          Allow/deny IP addresses/subnets
  -inetd        Inetd mode (default: 0)
  -uid          Run as user

 

这里说明一下 -cgi_ext  :shttpd没有CGI 目录的概念,它是通过认文件扩展名来识别的。要运行CGI 程序,默认情况下就要在编译好的程序后面加上 “.cgi””pl””php”等后缀。而 -cgi_ext  是你可以自定义其后缀。

四、开发板测试

 

静态网页测试

在开发板的 /var/www(由-root指定的根目录)放入测试网页:index.html 
在HOST的浏览器中输入开发板地址,测试通过!

 

CGI测试

在 /var/www (由-root指定的根目录)放入测试 CGI 程序:helloworldCGI.cgi
 在流览器中输入(开发板地址)192.168.1.2/helloworldCGI.cgi ,测试通过!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单元测试工具Numega BoundsChecker

From: http://blog.csdn.net/wangweitingaabbcc/article/details/7794985 1 前言 我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法。 NuMega是一个动态测试工具&#xff0c;主要应用于白盒测试。该工具的特点是学习简单、使用方便、功能有效。NuM…

Qt split字符串分割

1、需求 从指定格式的时间字符串中提取关键参数。 2、实现 调用字符串的split方法 QString text "12:14:35"; QStringList list text.split(":");int hour list[0].toInt(); int min list[1].toInt(); int sec list[2].toInt();

在Codeigniter框架中使用NuSOAP

0、NuSOAP的简介 NuSOAP 是一组功能强大的PHP类&#xff0c;这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写&#xff0c;可以无缝的与许多最流行的SOAP服务实现交互&#xff0c;它以LGPL协议进行发布。NuSOAP的主要特性包括&#xff1a; 简单&a…

[react] 你有使用过loadable组件吗?它帮我们解决了什么问题?

[react] 你有使用过loadable组件吗&#xff1f;它帮我们解决了什么问题&#xff1f; 目前有两个 react-loadable和 loadable component&#xff0c;用于代码分割&#xff0c;解决打包体积过大的问题 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易…

JAVA运行程序代码段

我记得那时候刚毕业。学习JAVA恐惧是这里&#xff0c;它是关于JAVA称号。我总是不正确。如今&#xff0c;这最后审查。看了好半天。得赶紧把刚才学习到的那点东西记下来。 一、关于static的代码段运行顺序 运行结果例如以下&#xff1a; Inside main() Mug(1) Mug(2) c1 & …

Keil使用PC-Lint

Keil使用PC-Lint 随着项目的推进与迭代&#xff0c;一个Project的代码量往往会不知不觉增长&#xff0c;当项目代码达到数万行&#xff0c;迭代经历较长时间后&#xff0c;仅靠开发人员自身的代码质量已不能满足对整体质量的把控。难以避免会出现一些潜在的逻辑错误与非逻辑错误…

我的网页设计(网页页面制作二)

嵌入网页页面制作出自个人的爱好&#xff0c;利用代码的编写融入产生web网页页面的应用效果&#xff0c;来进行页面的选择、搜索。这样可以大大的提高了参考者、浏览者的个人不同需要&#xff0c;从而也了解了对网页页面制作扩大范围和空间。也可以转换对网页页面字体产生文字体…

警告warning: strncpy specified bound XX equals destination size

1、问题 用strncpy字符串拷贝时&#xff0c;出现警告&#xff1a;warning: strncpy specified bound 32 equals destination size [-Wstringop-truncation]。 2、解决&#xff1a;strncpy不拷贝最后一个字节&#xff0c;手动给它赋值\0。 例子&#xff1a; #define SIZE 20…

ShellExecute 函数的用法和实例

From: http://blog.sina.com.cn/s/blog_49364213010003d8.html 今天帮同学做毕业设计时&#xff0c;用到了ShellExecute 函数&#xff0c;在这写一下。关于ShellExecute函数&#xff1a;在ShellAPI单元中&#xff0c;ShellExecute函数的定义为&#xff1a;HINSTANCE ShellExec…

[React]你有用过哪些React的表单库吗?说说它们的优缺点

[React]你有用过哪些React的表单库吗&#xff1f;说说它们的优缺点 redux-formreact-jsonschema-formformikunform 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题…

嵌入式产品开发流程

嵌入式产品&#xff0c;与普通电子产品一样&#xff0c;开发过程都需要遵循一些基本的流程&#xff0c;都是一个从需求分析到总体设计&#xff0c;详细设计到最后产品完成的过程。但是&#xff0c;与普通电子产品相比&#xff0c;嵌入式产品的开发流程又有其特殊之处。它包含嵌…

Codeforces 478B 6thweek contest_B

Random teams 题意&#xff1a; 有n个选手和m个队伍&#xff0c;让你分配&#xff0c;条件是每个队伍至少要有1个选手。分配完之后&#xff0c;每队伍里2个人可以组成一组&#xff0c;求分配完之后最多的组数和最少的组数 分析&#xff1a; 1. 最多的情况就是&#xff0c;先每…

apache代理IIS的80端口实现共存

IIS与apache共用80端口方法&#xff1a; 一&#xff1a;如何有多的公网IP。可在一个网卡上绑定多个IP来实现。 IIS6&#xff0c;多IP下共存&#xff0c;IIS为192.168.0.1&#xff0c;apache为192.168.0.2 原文地址到2003的CD下的 support/tools/Support.cab。解压出httpcfg.exe…

[react] 你有使用过formik库吗?说说它的优缺点

[react] 你有使用过formik库吗&#xff1f;说说它的优缺点 Formik提供了便捷的表单操作&#xff0c; 如获取表单数据&#xff0c;表单校验&#xff0c;提交事件等 结合yup来设置表单校验规则非常方便 Formik is a small library that helps you with the 3 most annoying par…

Linux 多线程开发-线程创建pthread_creat

1、函数原型 int pthread_creat(pthread_t *pid, const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg); pid&#xff1a;返回创建成功后的线程ID&#xff0c;unsigned int型变量&#xff1b;attr&#xff1a;设置线程属性&#xff0c;为NULL则为默认属性&…

Eclipse的maven插件最新地址

最新地址&#xff1a;http://download.eclipse.org/technology/m2e/releases 原先&#xff1a;http://m2eclipse.sonatype.org/sites/m2e转载于:https://www.cnblogs.com/binarysheep/p/4752793.html

USB大全

http://www.crifan.com/files/doc/docbook/usb_basic/release/html/usb_basic.html

[react] 怎样动态导入组件?

[react] 怎样动态导入组件&#xff1f; 自己使用 import 和 async/await 实现的异步组件React.lazy开源库 react-loadable 库/react-lazyload 库babel 动态导入&#xff08;Dynamic Import&#xff09; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

/dev/fb0入门练习

From: http://sunnyshineboy.blog.163.com/blog/static/20281511820124121118700/ 大家都知道Unix/Linux系统是由命令驱动的。那么最基本的系统是命令行的&#xff08;就是想DOS一样的界面&#xff09;。X&#xff0d;Window&#xff0d;System是Unix/Linux上的图形系统&…

Linux 多线程开发-等待线程结束pthread_join

1、函数原型 int pthread_join(pthread_t pid, void **value_ptr); pid&#xff1a;所等待的线程ID&#xff1b;value_ptr&#xff1a;通常设置为NULL&#xff0c;如果不为NULL&#xff0c;pthread_join将复制一份线程退出值到一个内存区域&#xff0c;并让*value_ptr指向该内…