﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-MemoryGarden's Blog-随笔分类-网络编程</title><link>http://www.cppblog.com/MemoryGarden/category/13528.html</link><description>努力

                                  -----------大能猫</description><language>zh-cn</language><lastBuildDate>Wed, 06 Jul 2011 04:47:18 GMT</lastBuildDate><pubDate>Wed, 06 Jul 2011 04:47:18 GMT</pubDate><ttl>60</ttl><item><title>TCP端口号与并发服务器</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Mon, 04 Jul 2011 19:00:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/150164.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/150164.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/150164.html</trackback:ping><description><![CDATA[背景 ： 并发服务器中，主服务循环通过派生一个子进程来处理每个新的连接，如果一个子进程继续使用服务器众所周知的端口来服务一个长时间的请求，那将会发生什么？<br />首先，在一台 IP地址为 10.2.16.48 的服务器，服务器在端口21上执行被动打开(socket,bind,listen) 等待客户请求。<br />服务器 ： {*：21，*：*} 之处服务器的套接字对，服务器在本地端口21上等待连接，外地IP地址和端口都没有指定，用 "*:*" 来表示<br /><br />稍后，IP地址为 10.22.206.157 的主机上启动第一个客户，它对服务器10.2.16.48 执行主动打开(connect) 假设客户主机的TCP为此选择临时端口为1500，当服务器接收到这个客户的连接的时候，服务器fork一个自身的副本，让子进程来处理该客户的请求<br /><br />至此，我们必须在服务器上区分监听套接字和已经连接的套接字，监听套接字与已连接的套接字使用共同的端口21。<br />下一步，我们假设在客户主机上有另外一个客户请求连接到同一台服务器，客户主机的TCP为这个客户的套接字分配一个未使用的端口，1501。<br /><br />对于服务器来说，这两个连接是有区别的，第一个连接的套接字对{10.22.206.157:1500,10.2.16.48:21} 和第二个连接的套接字对 {10.22.206.157:1501,10.2.16.48:21} 不一样，因为客户的TCP为第二个连接选择了一个未使用的端口 1501<br /><br />通过本例应该注意，TCP无法仅仅通过查看目的端口号来分离外来的分节到不同的端点，它必须通过查看套接字对的所有4个元素才能确定由哪个端点接收某个到达的分节。如上例，对于同一个本地端口21来说，存在3个套接字，如果一个分节来自 10.22.206.157:1500 目的地为 10.2.16.48:21 它就被递送给第一个子进程，如果一个分节来自 10.22.206.157:1501 目的地为 10.2.16.48:21 它就被递送给第二个子进程。所有目的端口为21的其他TCP分节，都被递送给拥有监听套接字的最初的父进程<br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/150164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-07-05 03:00 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/07/05/150164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>套接字对</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sun, 03 Jul 2011 16:44:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/150066.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/150066.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/150066.html</trackback:ping><description><![CDATA[一个TCP连接的套接字对(socket pair) 是一个定义该连接的两个端点的四元组：本地IP地址、本地TCP端口号、外地IP地址，外地TCP端口号。套接字对唯一标识网络的一个TCP连接。标识每个端点的两个值(IP和端口号) 通常成为一个 套接字<br /><br />ps: 好短....<img src ="http://www.cppblog.com/MemoryGarden/aggbug/150066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-07-04 00:44 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/07/04/150066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP连接的建立和终止</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sat, 02 Jul 2011 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/150007.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/150007.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/150007.html</trackback:ping><description><![CDATA[建立一个TCP连接时，会发生下述情形：<br /><br />1、服务器端必须做好准备接受外来的连接。这通常通过 socket(), bind(), listen() 三个函数来完成的。我们称之为 被动打开(passive open).<br /><br /><br />2、客户端通过调用connect发起主动打开(active open)。这导致客户端TCP发送SYN同步分节。它告诉服务器客户端在(待建立的)连接中发送的数据的初始化序列号。通用SYN分节不携带数据，<br />3、服务器必须确认(ACK) 客户端的SYN，同时自己也得发送一个SYN分节，它含有服务器将在统一连接中发送的数据的初始化序号。服务器在单个分节中发送SYN和对客户端SYN的ACK确认。<br />4、客户端必须确认服务器的SYN。<br /><br />TCP连接的终止：<br />1、某个应用程序首先调用close，主动关闭(active close) 该端的TCP于是发送一个FIN分节，表示数据发送完毕。<br />2、接收到这个FIN的对端执行被动关闭(passive close)。这个FIN是TCP确认。它的接收也作为一个文件结束符(end of file) 传递给接收端的应用程序(放在排队等候应用进程接收的任何其他数据之后)，因为FIN的接收意味着接收端应用程序在相应连接上再无额外数据可以接收。<br />3、一段时间以后，接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。<br />4、接收这个最终FINd额原发送端TCP(即执行主动关闭的一端)确认这个FIN<br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/150007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-07-02 22:23 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/07/02/150007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket gethostbyname</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149217.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149217.html</trackback:ping><description><![CDATA[struct hostent* gethostbyname(const char* name);<br /><br />struct hostent 是这样定义的：<br /><br />struct hostent{<br />&nbsp;&nbsp; char* h_name;<br />&nbsp;&nbsp; char **h_aliases;<br />&nbsp;&nbsp; int h_addrtype;<br />&nbsp;&nbsp; int h_length;<br />&nbsp;&nbsp; char **h_addr_list;<br />};<br /><br />解释 ：<br />&nbsp;&nbsp; h_name : 是这个主机的正式名称。<br />&nbsp;&nbsp; h_aliases : 是一个以NULL为结尾的数组，里面存储了主机的备用名称。<br />&nbsp;&nbsp; h_addr_type : 是返回地址的类型，一般来说是 "AF_INET"<br />&nbsp;&nbsp; int h_length&nbsp; ： 是地址的字节长度<br />&nbsp;&nbsp; h_addr_list ： 是一个以0为结尾的数组，存储了主机的网络地址(以网络字节序存储)<br /><br />&nbsp;&nbsp; <br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:24 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket gethostname</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:14:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149215.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149215.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149215.html</trackback:ping><description><![CDATA[gethostname 可以取得本地主机的信息。<br /><br />返回正在执行它的计算机的名字<br /><br />int gethostname(char* hostname, size_t size);<br />参数：<br />&nbsp;&nbsp; hostname :&nbsp; 指向字符数组的指针，当函数返回的时候，它里面的数据就是本地主机的名字。<br />&nbsp;&nbsp; size : 是hostname 只想数组的长度。<br /><br />返回值<br />&nbsp;&nbsp; －1 出错 errno 全局变量存储出错信息。<br />&nbsp;&nbsp; 0 成功。<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:14 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket getpeername</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149214.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149214.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149214.html</trackback:ping><description><![CDATA[这个函数可以取得一个已经连接上的套接字的远程信息(例如 ip, port) 告诉你在远程和你连接的究竟是谁。<br /><br />int getpeername(int sockfd, struct sockaddr* addr, int *addrlen);<br />参数：<br />&nbsp;&nbsp; sockfd 是你想取得远程信息的那个套接字描述符<br />&nbsp;&nbsp; addr 是一个指向 struct sockaddr 或者是 struct sockaddr_in 的指针。<br />&nbsp;&nbsp; addrlen : 是一个指向int的指针，应该赋予 sizeof(struct sockadd) 的大小<br />返回值：<br />&nbsp;&nbsp; －1，出错，全局变量 errno 中存储错误代码。<br />&nbsp;&nbsp; <img src ="http://www.cppblog.com/MemoryGarden/aggbug/149214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:10 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket getsockopt setsockopt</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 15:03:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149213.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149213.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149213.html</trackback:ping><description><![CDATA[int getsockopt (int sockfd, int level, int name, char* value, int* optlen);<br />int setsockopt (int sockfd, int level, int name, char* value, int* optlen);<br /><br />参数：<br />&nbsp;&nbsp; sockfd : 必须是一个已经打开的套接字<br />&nbsp;&nbsp; level : 是函数所使用的协议标准(protocol level) (TCP/IP 协议使用 IPPROTO_TCP, 套接字标准的选项使用 SOL_SOCKET)。<br />&nbsp;&nbsp; name : <br />&nbsp;&nbsp; value : 指向为 getsockopt()函数所获取的值。 setsockopt 所设置的值的地址。<br />&nbsp;&nbsp; <br />linux 系统所提供的socket库有一个bug,次错误表现为你不能为一个套接字重新启用一个端口号，即使在你正常关闭一个套接字以后。例如，你编写一个服务器在套接字上等待的一个程序，服务器打开套接字，并在其上侦听，是没有问题的，无论如何，总有一些原因，使你的程序需要重新启动，然后重新启动后，就不能把它绑定在原来的那个端口上了，从bind 系统调用返回代码总是说你试图连接的端口已经被别的进程所绑定。问题在于linux内核在一个绑定套接字的进程结束后，从不把端口标记为未用，解决这个问题的办法是，当套接字打开，但尚未有连接的时候，用setsockopt系统调用，设定如下选项<br /><br />当打开一个socket套接字的时候，必须同时用下面的代码段来调用setsockopt 函数<br /><br />&nbsp;&nbsp; int opt = 1;<br />&nbsp;&nbsp; int len = sizeof(opt)<br />&nbsp;&nbsp; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &amp;opt, &amp;len)<br /><br /> SO_REUSEADDR 选项将套接口设置成重新使用旧的地址(ip和port)，而不等待<br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 23:03 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket close shutdown</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149210.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 22 Jun 2011 14:26:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149210.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149210.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149210.html</trackback:ping><description><![CDATA[传输完毕后，你需要关闭这个套接字描述符所表示的连接。<br /><br />close(sockfd);<br /><br />执行了close之后，套接字将不会允许进行读写操作，任何企图读写一个已经关闭的套接字，都会收到一个错误。<br /><br />如果你想对网络套接字的关闭进行进一步的操作，可以使用 shutdown 操作，它允许你进行单向的关闭，或者是全部禁止掉。<br /><br />int shutdown(int sockfd, int how);<br /><br />参数 ： <br />&nbsp;&nbsp; sockfd : 你想关闭的套接字描述符。<br />&nbsp;&nbsp; how : 0--&gt; 不允许以后数据的接收操作; 1--&gt; 不允许以后数据的发送操作；2 --&gt; 和close一样，不允许以后数据的任何操作(接受和发送)<br />返回值：<br />&nbsp;&nbsp; 成功返回0&nbsp;&nbsp; 不成功返回－1。 全局变量 errno 里面存储了错误信息。<br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 22:26 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket recvfrom</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149153.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 21 Jun 2011 16:13:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149153.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149153.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149153.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149153.html</trackback:ping><description><![CDATA[int recvfrom (int sockfd, void* buf, int len, unsigned int flags, struct sockaddr* from, int* fromlen);<br /><br /><br />参数：<br />&nbsp;&nbsp; sockfd : 是你想要读取数据的套接字描述符<br />&nbsp;&nbsp; buf :&nbsp; 一个指针，指向你能存储数据的内存缓冲数据区<br />&nbsp;&nbsp; len ： 缓存区的尺寸大小。<br />&nbsp;&nbsp; flags ： 通常为0<br />&nbsp;&nbsp; from ： 是一个本地指针，指向一个struct sockaddr 的结构。<br />&nbsp;&nbsp; fromlen : 是一个指向int 数据类型的指针，它的大小应该是 sizeof(struct sockaddr) 当函数返回的时候，fromlen 指向的是from指向的 struct sockaddr 的实际大小。<br />&nbsp; <br />返回值 ： <br />&nbsp;&nbsp; 正常 ： 返回它接收的字节数，如果发生了错误，返回－1<br />&nbsp;&nbsp; <img src ="http://www.cppblog.com/MemoryGarden/aggbug/149153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 00:13 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket sendto</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149150.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 21 Jun 2011 16:05:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149150.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149150.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149150.html</trackback:ping><description><![CDATA[进行无连接的UDP通讯使用的。<br /><br />使用sendto 函数，则数据会在没有建立任何网络连接额网络上传输。<br /><br />int sendto(int sockfd, const void* msg, int len, int flags, const struct sockaddr *to, int tolen);<br />参数：<br />&nbsp;&nbsp; sockfd : 代表你与远程程序连接的套接字<br />&nbsp;&nbsp; msg : 是一个指针，指向你想发送的信息的地址。<br />&nbsp;&nbsp; len: 是你想发送的信息的长度。<br />&nbsp;&nbsp; flags : 通常是0<br />&nbsp;&nbsp; to:一个指向 struct sockaddr 结构的指针，里面包含了远程主机和端口数据。<br />&nbsp;&nbsp; tolen :&nbsp; 指出了struct sockaddr 的大小，通常 sizeof(struct sockaddr);<br /><br />返回值 ： <br />&nbsp;&nbsp; 正常 ： 真正发送的数据的大小<br />&nbsp;&nbsp; 错误 ： －1 <br /><br />和send 函数一样，sendto 返回它所真正发送的数据的字节数，真正发送的字节数可能小于你所给它的数据的字节数。<br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-22 00:05 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/22/149150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket recv</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149149.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 21 Jun 2011 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149149.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149149.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149149.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149149.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149149.html</trackback:ping><description><![CDATA[函数 recv 在许多方面与 send 函数相似<br /><br />int recv (int sockfd, void* buf, int len, unsigned int flags);<br />参数：<br />&nbsp;&nbsp; sockfd ：是你要读取数据的套接字描述符。<br />&nbsp;&nbsp; buf : 是一个指针，指向能存储数据的内存缓存数据。<br />&nbsp;&nbsp; len :&nbsp; 是缓存区的大小。<br />&nbsp;&nbsp; flags : 一般为0<br /><br />返回值： <br />&nbsp;&nbsp; 正常： 它真正收到数据的长度<br />&nbsp;&nbsp; 错误 ： -1(如网络终端，对方关闭了套接字等等) 全局变量 errno 中存储了错误的代码。<br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-21 23:59 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket send</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149148.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 21 Jun 2011 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149148.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149148.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149148.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149148.html</trackback:ping><description><![CDATA[通过套接字进行通讯的函数<br /><br />int send(int sockfd, const void* msg, int len, int flags);<br />参数：<br />&nbsp;&nbsp; sockfd ：代表你与远程程序连接的套接字<br />&nbsp;&nbsp; msg : 是一个指针，指向你想要发送信息的地址<br />&nbsp;&nbsp; len :&nbsp; 是你想要发送信息的长度<br />&nbsp;&nbsp; flags :&nbsp; 发送标记，一般为0<br /><br />返回值：<br />&nbsp;&nbsp; 正常 ：真正发送数据的长度。<br />&nbsp;&nbsp; 错误 ： －1，错误代码存储在全局变量 errno 中。<br />send 发送数据的长度可能小于你给它的参数所制定的长度，如果你给send的参数中包含数据长度大于send一次所能发送的数据，则send函数只能发送它所能发送的最大的长度，然后它相信你会把剩下的数据再次调用它来进行发送。<br />所以，如果send的返回值如果小雨 len的话，则你需要再次发送剩下的数据，如果包足够小(1K)，那么send会一次发送完成的。<br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-21 23:54 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket accept</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149073.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Mon, 20 Jun 2011 17:14:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149073.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/149073.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/149073.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/149073.html</trackback:ping><description><![CDATA[大致过程如下：<br /><br />&nbsp;&nbsp; 客户机通过connect 函数来连接你机器上，某个你已经listen的端口<br />&nbsp;&nbsp; 他的连接将被listen加入队列等待accept函数的调用。<br />&nbsp;&nbsp; 你调用accept函数告诉他你准备连接。<br />&nbsp;&nbsp; accept函数返回一个新的套接字描述符，这个描述符代表了这个连接。<br /><br />&nbsp;&nbsp; 这时候，我们有两个套接字描述符，返回给你的就是和远程计算机的连接，而第一个套接字描述符仍然在你的机器上原来的那个端口上listen<br />&nbsp;&nbsp; 得到的新的套接字的描述符就可以调用 send 和recv的操作了<br /><br /><br />&nbsp;&nbsp; int accept(int sockfd, void* addr, int *addrlen);<br />&nbsp;参数：<br />&nbsp;&nbsp; sockfd ： 正在listen的套接字描述符<br />&nbsp;&nbsp; addr ： 一般是指向一个 sockaddr_in 结构的指针，里面存储着远程计算机的信息<br />&nbsp;&nbsp; addrlen :&nbsp; 通常是 sizeof(struct sockaddr_in)<br />返回值：<br />&nbsp;&nbsp; －1 代表出错<br />&nbsp;&nbsp; 正常返回一个新的套接字描述符<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/149073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-21 01:14 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/21/149073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket listen</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148827.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Thu, 16 Jun 2011 18:23:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148827.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148827.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148827.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148827.html</trackback:ping><description><![CDATA[listen()函数是等待别人连接，系统进行监听请求的函数。当有人连接你的时候，你需要做两步，通过listen函数等待连接请求，然后使用accept 函数处理<br /><br /><br />int listen(int sockfd, int backlog);<br />sockfd : 是一个套接字描述符，由socket()系统调用获得。<br />backlog : 是未经处理的连接请求可以容纳的最大的数目，每一个连接请求都要进入一个请求队列，等待listen的程序来调用accept函数来接手这个连接。当系统还没有<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 调用accept()函数的时候，如果有很多连接，那么本地能够等待的最大数目的连接数，就是backlog的数值。<br /><br /><br /><br />返回值 ： －1说明在listen()函数执行过程中发生了错误。全局变量 errno 中存储了错误代码。<br /><br />如果你想要一个端口上接受外来请求的话，那么函数的调用顺序为 ： <br />socket();<br />bind();<br />listen();<br />accept();<img src ="http://www.cppblog.com/MemoryGarden/aggbug/148827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-17 02:23 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket connect</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148826.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Thu, 16 Jun 2011 18:00:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148826.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148826.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148826.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148826.html</trackback:ping><description><![CDATA[int connect(int sockfd, struct sockaddr* serv_addr, int addrlen);<br /><br />socket : 套接字文件描述符,由socket函数返回的.<br />serv_addr : 是一个存储远程计算机ip地址和端口信息的结构<br />addrlen :&nbsp; sizeof(serv_addr)<br /><br />返回值 ： 如果发生了错误，它会返回错误值－1 全局变量 errno 将会存储错误代码。<br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-17 02:00 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket bind</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148750.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Thu, 16 Jun 2011 17:40:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148750.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148750.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148750.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148750.html</trackback:ping><description><![CDATA[bind 函数可以帮助你指定一个套接字使用的端口<br />当你使用socket 函数获得一个套接字描述符后，你也许需要将socket绑定上一个你的机器的端口<br />&nbsp;&nbsp; 当你需要进行端口listen操作，等待接收一个连入请求的时候，一般需要这一步。<br />&nbsp;&nbsp; 与客户端的套接字关联的地址没有太大意义，当你只是想连接一台服务器，也就是进行connect操作的时候，这一步并不是必须的。<br /><br />int bind(int sockfd, struct sockaddr* my_addr, int addrlen);<br />&nbsp;&nbsp; sockfd:由socket函数返回的套接字描述符<br />&nbsp;&nbsp; my_addr : 是一个指向 sockaddr 的一个指针，包含你的地址信息，名称，端口和ip地址。<br />&nbsp;&nbsp; addrlen : sizeof(my_addr)<br /><br />限制：<br />&nbsp;&nbsp; 在进程所运行的机器上，指定的地址必须有效，不能指定一个其他机器的地址<br />&nbsp;&nbsp; 地址必须和创建套接字时的地址族所支持的格式匹配<br />&nbsp;&nbsp; 端口号不能小于1024，除非改进程具有相应的特权<br /><br />如果ip指定为 INADDR_ANY，套接字端点可以被绑定到所有的系统网络端口。如果调用connect 或者 listen 但是没有绑定一个套接字，系统会选择一个地址，并将其绑定到套接字。<br /><br />返回值：<br />&nbsp;&nbsp; 出错的时候返回－1<br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-17 01:40 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/17/148750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket ip 转换函数</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/16/148690.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 15 Jun 2011 16:06:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/16/148690.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148690.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/16/148690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148690.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148690.html</trackback:ping><description><![CDATA[仅仅适用于ipv4的函数：<br />&nbsp;&nbsp; 1 : inet_addr 函数将数字和点组成的字符串转换为一个无符号长整形<br />&nbsp;&nbsp; &nbsp;&nbsp; ina.sin_addr.s_addr = inet_addr("10.2.3.44")<br />&nbsp;&nbsp; &nbsp;&nbsp; 注意：inet_addr 返回的已经是网络字节序的了，没有必要再次调用&nbsp; htonl 函数<br />&nbsp;&nbsp; 2 : inet_ntoa 函数接受一个sin_addr 将 sin_addr.s_addr 转换为&nbsp; num.num.num.num 这样的字符串。<br />&nbsp;&nbsp; &nbsp;&nbsp; 注意：inet_ntoa 函数接收的是一个 sin_addr 的类型的参数，并不是一个长整形。<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; inet_ntoa 返回一个字符串指针，它指向一个定义在函数 inet_ntoa 内static 类型字符串，所以对这个函数每次调用，都会改变上一次的调用结果<br /><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">netinet</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arpa</span><span style="color: #000000; ">/</span><span style="color: #000000; ">inet.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(){<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;s[</span><span style="color: #000000; ">10</span><span style="color: #000000; ">];<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;memset(s,&nbsp;</span><span style="color: #000000; ">'</span><span style="color: #000000; ">\0</span><span style="color: #000000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(s));<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;memcpy(s,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">2.3.4.5</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ans&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;inet_addr(s);<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%s&nbsp;--&gt;&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;s,&nbsp;ans);<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; ">&nbsp;in_addr&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">.s_addr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ans;<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d&nbsp;--&gt;&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;ans,&nbsp;inet_ntoa(</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">));<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; "></span></div><br /><br />输出：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">2.3</span><span style="color: #000000; ">.</span><span style="color: #000000; ">4.5</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">84148994</span><span style="color: #000000; "><br /></span><span style="color: #000000; ">84148994</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2.3</span><span style="color: #000000; ">.</span><span style="color: #000000; ">4.5</span><span style="color: #000000; "><br /></span></div><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-16 00:06 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/16/148690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket 地址格式</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148689.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 14 Jun 2011 16:37:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148689.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148689.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148689.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148689.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148689.html</trackback:ping><description><![CDATA[Linux 中，套接字地址用如下结构表示：<br /><br />struct in_addr{<br />&nbsp;&nbsp; in_addr_t s_addr;<br />};<br /><br />struct sockaddr_in{<br />&nbsp;&nbsp; sa_family_t sin_family; //address family<br />&nbsp;&nbsp; in_port_t sin_port //port number<br />&nbsp;&nbsp; struct in_addr sin_addr;//ipv4 address<br />&nbsp;&nbsp; unsigned char sin_zero[8] //filler<br />};<br /><br />in_port_t 定义为uint16_t<br />in_addr_t 定义为uint32_t<br /><br />其中，成员 &nbsp; sin_zero 为填充字段，必须全部设置为0<br /><br />sin_port 与 sin_addr.s_addr 必须是网络字节序的。<br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148689.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-15 00:37 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148689.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字节序</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148686.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 14 Jun 2011 16:15:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148686.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148686.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148686.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148686.html</trackback:ping><description><![CDATA[每一台机器内部对变量的字节存储顺序不同，(有的系统是高位在前，地位在后，而有的是相反的)，而网络传输数据大家一定要统一顺序，所以，对内部字节表示顺序和网络字节序不同的机器，就一定要对数据进行转换(比如ip地址，端口的表示) 如果相同的话，也要调用，转换与否是由系统函数自己来决定的。<br /><br /><br />uint32_t htonl(uint32_t hostint32) // host to network long&nbsp;&nbsp; 以网络字节序表示的32位整数<br />uint16_t htons(uint16_t hostint16)// host to network short&nbsp;&nbsp; 以网络字节序表示的16位整数<br />uint32_t ntohl(uint32_t netint32) //network to host long&nbsp;&nbsp; &nbsp;&nbsp; 以主机字节序表示的32位整数<br />uint16_t ntohs(uint16_t netint16) //network to host short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以主机字节序表示的16位整数<br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-15 00:15 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/15/148686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket    ----      shutdown</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/10/148387.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Thu, 09 Jun 2011 16:59:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/10/148387.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148387.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/10/148387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148387.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148387.html</trackback:ping><description><![CDATA[int shutdown(int sockfd, int how)<br /><br />如果how 是 SHUT_RD 关闭读端，那么，无法从套接字读取数据。<br />如果how 是 SHUT_WR 关闭写端，那么，无法使用套接字发送数据。<br />如果how 是 SHUT_RDWR 那么 同时无法读取数据和发送数据<br /><br />能够close(关闭) 套接字，但是close只有在最后一个活动引用被关闭的时候，才释放网络端点，这意味着，如果复制了一个套接字(dup) 套接字直到关闭了最后一个引用它的文件描述符之后，才会被释放而shutdown 允许一个套接字处于不活动的状态，无论引用它的文件描述符的数目多少。<br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-10 00:59 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/10/148387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>套接字 socket</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/09/148308.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 08 Jun 2011 17:06:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/09/148308.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148308.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/09/148308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148308.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148308.html</trackback:ping><description><![CDATA[套接字是通信断电的抽象。&nbsp; <br /><br />int socket(int domain, int type, int protocol)<br /><br />domain : 确定通信的特征，每个domain 通常以 AF_ 开头(address family)<br />AF_INET(ipv4因特网域)<br />AF_INET6 (ipv6因特网域)<br />AF_UNIX(UNIX 域)<br />AF_UNSPEC(未指定)<br /><br /><br />type : 套接字的类型，进一步确定通信的特征<br />SOCK_DGRAM(长度固定，无连接的不可靠的报文传递)<br />SOCK_RAW(IP协议的数据报接口)<br />SOCK_SEQPACKET(长度固定，有序，可靠的面向连接报文传递)<br />SOCK_STREAM(有序，可靠，双向的面向连接字节流)<br /><br />proto : 通常是0<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-09 01:06 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/09/148308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pthread_cond</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148241.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 07 Jun 2011 18:00:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148241.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148241.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148241.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148241.html</trackback:ping><description><![CDATA[条件变量 pthread_cond， 另外一种线程间的同步机制。普通的 mutex 只允许一个线程进入临界区，就是拿到mutex这把锁的线程，而cond 允许多个线程同时进入临界区，由它来控制，在某些条件成立的时候，来唤醒其中一个等待着的线程，或者是唤醒所有等待着的线程。<br /><br />int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);<br />int pthread_cond_timewait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* tout)<br /><br />传递给pthrad_cond_wait 的互斥量 mutex 对条件进行保护，调用者把锁住的互斥量传递给pthread_cond_wait 函数，函数把调用线程放到等待条件的线程列表里面，然后对互斥量解锁，当pthread_cond_wait 返回的时候，互斥量再次被锁住。函数 pthread_cond_timewait 与 pthread_cond_wait 差不多，只不过是多了一个超时时间的限制。<br />两个函数调用成功返回的时候，需要重新检查条件，因为其他线程可能更改了条件。<br /><br />int pthread_cond_signal(pthread_cond_t* cond);<br />int pthread_cond_broadcast(pthread_cond_t* cond);<br /><br />pthread_cond_signal 函数将唤醒等待该条件的某个线程，pthread_cond_broadcast 将唤醒等待改条件的所有线程。<br /><br />下面的例子很简单的使用了 cond 。 使用cond 我们可以比较高效的写出一个 线程池。<br /><br />&nbsp;<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">pthread.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">pthread_mutex_t&nbsp;mutex;<br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">pthread_cond_t&nbsp;cond;<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">thread_zero_run(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">arg){<br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mutex);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;lock&nbsp;the&nbsp;mutex</span><span style="color: #008000;"><br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(val&nbsp;</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">){&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">condition.&nbsp;&nbsp;use&nbsp;while&nbsp;for&nbsp;double&nbsp;check</span><span style="color: #008000;"><br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">thread_zero_run&nbsp;--&gt;&nbsp;val:%d,&nbsp;wait&nbsp;for&nbsp;wake&nbsp;up\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;val);<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_wait(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cond,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mutex);</span><span style="color: #008000;">//</span><span style="color: #008000;">call&nbsp;pthread_cond_wait</span><span style="color: #008000;"><br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">therad_zero_run&nbsp;--&gt;&nbsp;val:%d,&nbsp;zero&nbsp;it&nbsp;and&nbsp;unlock\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;val);<br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">do&nbsp;&nbsp;sth</span><span style="color: #008000;"><br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mutex);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">unlock&nbsp;the&nbsp;mutex</span><span style="color: #008000;"><br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_exit((</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">thread_add_run(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">arg){<br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">){<br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_lock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mutex);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">lock&nbsp;the&nbsp;mutex</span><span style="color: #008000;"><br /></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">val;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">do&nbsp;sth</span><span style="color: #008000;"><br /></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_mutex_unlock(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mutex);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">unlock&nbsp;the&nbsp;mutex</span><span style="color: #008000;"><br /></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_cond_signal(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cond);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">wake&nbsp;up&nbsp;a&nbsp;therad&nbsp;whick&nbsp;is&nbsp;waiting&nbsp;for&nbsp;the&nbsp;cond</span><span style="color: #008000;"><br /></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">after&nbsp;add&nbsp;val:%d&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;for&nbsp;check\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;val);<br /></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_exit((</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br /></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_t&nbsp;t_add,&nbsp;t_zero;<br /></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_cond_init(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">cond,&nbsp;NULL);<br /></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pthread_create(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t_add,&nbsp;NULL,&nbsp;thread_add_run,&nbsp;NULL)){<br /></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pthread_create(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">t_zero,&nbsp;NULL,&nbsp;thread_zero_run,&nbsp;NULL)){<br /></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_join(t_add,&nbsp;NULL);<br /></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_join(t_zero,&nbsp;NULL);<br /></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /></span></div><br /><br />输出：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">therad_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;zero&nbsp;it&nbsp;and&nbsp;unlock<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">therad_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;zero&nbsp;it&nbsp;and&nbsp;unlock<br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">after&nbsp;add&nbsp;val:</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;and&nbsp;wake&nbsp;up&nbsp;one&nbsp;zero&nbsp;thread&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;check<br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">therad_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;zero&nbsp;it&nbsp;and&nbsp;unlock<br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">thread_zero_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;val:</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;wait&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;wake&nbsp;up<br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;"></span><span style="color: #000000;">^</span><span style="color: #000000;">C</span></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-08 02:00 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pthread_mutex</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148240.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 07 Jun 2011 16:53:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148240.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148240.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148240.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148240.html</trackback:ping><description><![CDATA[int pthread_mutex_init(pthrad_mutex_t* mutex, const pthread_mutexatr_t* attr);<br />初始化互斥量mutex<br /><br />int pthread_mutex_destory(pthread_mutex_t* mutex);<br />如果动态分配互斥量，那么在释放内存前，需要调用这个函数。<br /><br />int pthread_mutex_lock(pthread_mutex_t* mutex);<br />对互斥量进行加锁。<br /><br />int pthread_mutex_unlock(pthread_mutex_t* mutex);<br />对互斥量进行解锁。<br /><br />int pthread_mutex_trylock(pthread_mutex_t* mutex);<br />不会出现阻塞。尝试对互斥量进行加锁，如果互斥量未被锁住，那么函数将锁住互斥量，并返回0，否则失败，不能锁住互斥量，返回EBUSY<br /><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">pthread.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">pthread_mutex_t&nbsp;mutex;<br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;val;<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">thread_run(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">arg){<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">pthread_mutex_lock(&amp;mutex);</span><span style="color: #008000;"><br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;num&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">((</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">)arg);<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(num&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">){<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">thread_run&nbsp;--&gt;&nbsp;num:%d,&nbsp;val:%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;num,&nbsp;val);<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">val;<br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">pthread_mutex_unlock(&amp;mutex);</span><span style="color: #008000;"><br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;pthread_exit((</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;val&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;para[</span><span style="color: #000000;">10</span><span style="color: #000000;">];<br /></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_t&nbsp;tid[</span><span style="color: #000000;">10</span><span style="color: #000000;">];<br /></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pthread_mutex_init(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">mutex,NULL)){<br /></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">init&nbsp;mutex&nbsp;error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i){<br /></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;para[i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br /></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pthread_create(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">tid[i],&nbsp;NULL,&nbsp;thread_run,&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">para[i]))){<br /></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i){<br /></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(tid[i],&nbsp;NULL);<br /></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">}</span></div><br />同时启动10个线程，但是10个线程间没有同步的去读或者写val变量。<br /><br />没加锁的输出如下:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">5</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">5</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">5</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">5</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">5</span></div><br />加锁输出如下：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">2</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">4</span><span style="color: #000000;"><br />thread_run&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;">&nbsp;num:</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;val:</span><span style="color: #000000;">5</span></div><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-08 00:53 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/08/148240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pthread_exit pthread_join</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/07/148167.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Mon, 06 Jun 2011 16:07:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/07/148167.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148167.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/07/148167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148167.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148167.html</trackback:ping><description><![CDATA[void pthread_exit(void * rval_ptr)<br />线程退出函数&nbsp;&nbsp;&nbsp; 其他线程可以通过 pthread_jion 得到这个 无类型指针 rval_ptr<br /><br />int pthread_join (pthread_t tid, void **rval_ptr)<br />等待线程 tid 终止，调用线程将阻塞，直到 线程 tid 调用 pthrad_exit, 返回，或者被取消。 rval_ptr就是调用 exit 的参数，如果对返回值不感兴趣， 可以传递NULL<br /><br />一下程序在 开启的第奇数个线程的时候，会sleep 相应的秒数，运行时，主线程由于调用 pthread_join 阻塞，可以看到标准输出会卡。<br /><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">pthread.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;args{<br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;name[</span><span style="color: #000000;">10</span><span style="color: #000000;">];<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;exit_code;<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">};<br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;thread_run(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">arg){<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;args</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;args</span><span style="color: #000000;">*</span><span style="color: #000000;">)arg;<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s&nbsp;run,&nbsp;id:%u\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;a</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">name,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)(pthread_self()));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;use&nbsp;arg&nbsp;to&nbsp;get&nbsp;the&nbsp;params;</span><span style="color: #008000;"><br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(a</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">exit_code&nbsp;</span><span style="color: #000000;">%</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">){<br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sleep(a</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">exit_code);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;make&nbsp;the&nbsp;thread&nbsp;sleep&nbsp;some&nbsp;second;</span><span style="color: #008000;"><br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">im&nbsp;thread&nbsp;%d,&nbsp;here&nbsp;sleep&nbsp;%d&nbsp;second!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;a</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">exit_code,&nbsp;a</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">exit_code);<br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_exit((</span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">(a</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">exit_code)));<br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_t&nbsp;tid[</span><span style="color: #000000;">10</span><span style="color: #000000;">];&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">thread_ids</span><span style="color: #008000;"><br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;args&nbsp;a[</span><span style="color: #000000;">10</span><span style="color: #000000;">];&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">thread_function's&nbsp;args</span><span style="color: #008000;"><br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">ec;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">exit&nbsp;code</span><span style="color: #008000;"><br /></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br /></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i){<br /></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;a[i].name[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sprintf(a[i].name,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">thread_%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;i);<br /></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;a[i].exit_code&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br /></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pthread_create(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">tid[i],&nbsp;NULL,&nbsp;thread_run,&nbsp;(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a[i]))){&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">call&nbsp;pthread_create&nbsp;to&nbsp;create&nbsp;a&nbsp;thread&nbsp;use&nbsp;arg[i]</span><span style="color: #008000;"><br /></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i){<br /></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;pthread_join(tid[i],&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">ec);</span><span style="color: #008000;">//</span><span style="color: #008000;">wait&nbsp;for&nbsp;thread&nbsp;tid[i]&nbsp;stop;</span><span style="color: #008000;"><br /></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s&nbsp;exit&nbsp;code&nbsp;is:%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;a[i].name,&nbsp;(</span><span style="color: #000000;">*</span><span style="color: #000000;">(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">*</span><span style="color: #000000;">)ec));<br /></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /></span></div><br />编译 ： <br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">g</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;.</span><span style="color: #000000;">/</span><span style="color: #000000;">pthread_exit.cpp&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">lpthread&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">opthread_exit</span></div><br />结果：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">thread_0&nbsp;run,&nbsp;id:</span><span style="color: #000000;">968255760</span><span style="color: #000000;"><br />thread_2&nbsp;run,&nbsp;id:</span><span style="color: #000000;">951470352</span><span style="color: #000000;"><br />thread_1&nbsp;run,&nbsp;id:</span><span style="color: #000000;">959863056</span><span style="color: #000000;"><br />thread_3&nbsp;run,&nbsp;id:</span><span style="color: #000000;">943077648</span><span style="color: #000000;"><br />thread_4&nbsp;run,&nbsp;id:</span><span style="color: #000000;">934684944</span><span style="color: #000000;"><br />thread_5&nbsp;run,&nbsp;id:</span><span style="color: #000000;">926292240</span><span style="color: #000000;"><br />thread_6&nbsp;run,&nbsp;id:</span><span style="color: #000000;">917899536</span><span style="color: #000000;"><br />thread_7&nbsp;run,&nbsp;id:</span><span style="color: #000000;">909506832</span><span style="color: #000000;"><br />thread_8&nbsp;run,&nbsp;id:</span><span style="color: #000000;">901114128</span><span style="color: #000000;"><br />thread_9&nbsp;run,&nbsp;id:</span><span style="color: #000000;">892721424</span><span style="color: #000000;"><br />thread_0&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">0</span><span style="color: #000000;"><br />im&nbsp;thread&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;here&nbsp;sleep&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;second</span><span style="color: #000000;">!</span><span style="color: #000000;"><br />thread_1&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />thread_2&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">2</span><span style="color: #000000;"><br />im&nbsp;thread&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;here&nbsp;sleep&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">&nbsp;second</span><span style="color: #000000;">!</span><span style="color: #000000;"><br />thread_3&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">3</span><span style="color: #000000;"><br />thread_4&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">4</span><span style="color: #000000;"><br />im&nbsp;thread&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;here&nbsp;sleep&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;second</span><span style="color: #000000;">!</span><span style="color: #000000;"><br />thread_5&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">5</span><span style="color: #000000;"><br />thread_6&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">6</span><span style="color: #000000;"><br />im&nbsp;thread&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">,&nbsp;here&nbsp;sleep&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">&nbsp;second</span><span style="color: #000000;">!</span><span style="color: #000000;"><br />thread_7&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">7</span><span style="color: #000000;"><br />thread_8&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">8</span><span style="color: #000000;"><br />im&nbsp;thread&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">,&nbsp;here&nbsp;sleep&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">&nbsp;second</span><span style="color: #000000;">!</span><span style="color: #000000;"><br />thread_9&nbsp;exit&nbsp;code&nbsp;</span><span style="color: #0000ff;">is</span><span style="color: #000000;">:</span><span style="color: #000000;">9</span></div><br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-07 00:07 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/07/148167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pthread_create</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148142.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Mon, 06 Jun 2011 06:55:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148142.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148142.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148142.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148142.html</trackback:ping><description><![CDATA[int pthread_create (pthread_t tid, const pthread_attr_t* attr, void *(*start_fun)(void), void* arg);<br /><br />创建线程函数：<br />&nbsp;&nbsp; tid : 创建线程成功后的线程ID。<br />&nbsp;&nbsp; attr: 线程的一些配置，用于指定各种线程的属性。<br />&nbsp;&nbsp; start_fun： 线程创建以后从这个函数开始执行。<br />&nbsp;&nbsp; arg : start_fun 的参数。&nbsp; <br />&nbsp;&nbsp; 返回值 ： 0为创建成功。<br /><br />和 fork后父子进程的运行先后顺序未知是一样的，主线程创建了子线程，运行顺序同样未知。<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">pthread.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;printids(</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;s){<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pid_t&nbsp;pid;<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_t&nbsp;tid;<br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getpid();<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;tid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pthread_self();<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s&nbsp;&nbsp;&nbsp;pid:%u&nbsp;tid:%u\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;s,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)pid,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)tid);<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;pthread_run(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">arg){<br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;printids(</span><span style="color: #000000;">"</span><span style="color: #000000;">new&nbsp;thread</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;((</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_t&nbsp;tid;<br /></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pthread_create(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">tid,&nbsp;NULL,&nbsp;pthread_run,&nbsp;NULL)){<br /></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">error</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;sleep(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;printids(</span><span style="color: #000000;">"</span><span style="color: #000000;">main&nbsp;thread</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;"></span></div><br />运行结果：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;thread&nbsp;&nbsp;&nbsp;pid:</span><span style="color: #000000;">4345</span><span style="color: #000000;">&nbsp;tid:</span><span style="color: #000000;">3175823632</span><span style="color: #000000;"><br />main&nbsp;thread&nbsp;&nbsp;&nbsp;pid:</span><span style="color: #000000;">4345</span><span style="color: #000000;">&nbsp;tid:</span><span style="color: #000000;">3191752464</span></div><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-06 14:55 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pthread_self, pthread_equal</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148140.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Mon, 06 Jun 2011 06:46:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148140.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148140.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148140.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148140.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148140.html</trackback:ping><description><![CDATA[pthread_t pthread_self();&nbsp; 获取线程自身ID<br /><br />int pthread_equal(pthread_t threadid1, pthread_t thread2)&nbsp; 判断两个线程ID是否相等，返回0 不相等，非零相等。<br /><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">pthread.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_t&nbsp;pid1;<br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pthread_t&nbsp;pid2;<br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pid1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pthread_self();<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;pid2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pthread_self();<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">pid1:%u,&nbsp;pid2:%u,&nbsp;equal:%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)pid1,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)pid2,&nbsp;(pthread_equal(pid1,&nbsp;pid2)&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">));<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;"></span></div><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">g</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;.</span><span style="color: #000000;">/</span><span style="color: #000000;">pthread_self.cpp&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">lpthread&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">o&nbsp;pthread_self</span></div><br />输出：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">pid1:</span><span style="color: #000000;">545519376</span><span style="color: #000000;">,&nbsp;pid2:</span><span style="color: #000000;">545519376</span><span style="color: #000000;">,&nbsp;equal:</span><span style="color: #000000;">1</span></div><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148140.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-06 14:46 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/06/148140.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE vfork</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/05/vfork.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sun, 05 Jun 2011 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/05/vfork.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148115.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/05/vfork.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148115.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148115.html</trackback:ping><description><![CDATA[vfork 同 fork 的返回值是一样的，不同的地方是vfork通常创建子进程的目的是 exec一个新的程序，vfork不将父进程的地址空间完全复制到子进程中，因为子进程会立即调用 exec 或者是 exit 于是就不会存在访问该空间。如果子进程在调用 exec 或者 exit 的时候，它是在父进程的空间中运行的。vfork 保证子进程先运行，它在exec 或 exit 之后，父进程才会被执行(如果子进程中依赖父进程的进一步操作，那么，悲剧了，死锁)<br /><br /><br />下面代码当子进程在 _exit 之前改变了变量 value 的值，父进程也改变了，这是因为vfork 出来的子进程是在父进程的地址空间运行的。&nbsp;&nbsp; 父进程没有 sleep 是因为 vfork 确保了子进程执行结束后，父进程才开始。<br /><br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">types.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;"><br /></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br /></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;pid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vfork();<br /></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pid&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">){<br /></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;puts(</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pid&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">){&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">child</span><span style="color: #008000;"><br /></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">value;<br /></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">child&nbsp;father&nbsp;id:%d,&nbsp;value:%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;getppid(),&nbsp;value);<br /></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;_exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;child&nbsp;process&nbsp;is&nbsp;end;&nbsp;father&nbsp;process&nbsp;begin.</span><span style="color: #008000;"><br /></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">parent</span><span style="color: #008000;"><br /></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">father&nbsp;child&nbsp;id:%d,&nbsp;value:%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">, pid,&nbsp;value);<br /></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br /></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">}<br /></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"></span></div><br />运行结果：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">child&nbsp;father&nbsp;id:</span><span style="color: #000000;">3072</span><span style="color: #000000;">,&nbsp;value:</span><span style="color: #000000;">1</span><span style="color: #000000;"><br />father&nbsp;child&nbsp;id:</span><span style="color: #000000;">3073</span><span style="color: #000000;">,&nbsp;value:</span><span style="color: #000000;">1</span></div><br /><br /><br /><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-05 16:50 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/05/vfork.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APUE fork</title><link>http://www.cppblog.com/MemoryGarden/archive/2011/06/05/fork.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sun, 05 Jun 2011 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2011/06/05/fork.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/148114.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2011/06/05/fork.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/148114.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/148114.html</trackback:ping><description><![CDATA[fork 在现有进程下创建一个新的进程，现有进程为父进程，新创建的进程为子进程。子进程创建后，获得父进程的数据空间，堆栈的副本(子进程改变，父进程不改变)<br /><br />父子进程的执行顺序是不确定的，取决于内核的调度算法，如果要求父子进程之间的相互同步，则要求某种形式的进程间通信(IPC)&nbsp; 下面代码在父进程中sleep了2秒，但是不保证子进程可以完全执行完毕。<br /><br /><br />进程执行的示意图 <br /><br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/memorygarden/10432/fork..jpg" width="432" height="453" /><br /><br /><br />运行结果 ：<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">process&nbsp;id:</span><span style="color: #000000;">2954</span><span style="color: #000000;"><br /></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">IM&nbsp;CHILD&nbsp;parent&nbsp;id:</span><span style="color: #000000;">2954</span><span style="color: #000000;">,&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;"><br /></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">IM&nbsp;FATHER&nbsp;child&nbsp;id:</span><span style="color: #000000;">2955</span><span style="color: #000000;">,&nbsp;value:</span><span style="color: #000000;">0</span></div><br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">types.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(){<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">process&nbsp;id:%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;getpid());<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;pid&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fork();<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pid&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;puts(</span><span style="color: #000000;">"</span><span style="color: #000000;">ERROR&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">pid){&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">child</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">value;<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">IM&nbsp;CHILD&nbsp;parent&nbsp;id:%d,&nbsp;value&nbsp;=&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;getppid(),&nbsp;value);<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">parent</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">IM&nbsp;FATHER&nbsp;child&nbsp;id:%d,&nbsp;value:%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;pid,&nbsp;value);<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">}<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"></span></div><img src ="http://www.cppblog.com/MemoryGarden/aggbug/148114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2011-06-05 16:14 <a href="http://www.cppblog.com/MemoryGarden/archive/2011/06/05/fork.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>