当前位置: 技术问答>linux和unix
为什么一个线程创建的套接字在另一线程中无法使用?
来源: 互联网 发布时间:2016-06-10
本文导语: 如题,一个进程中的所有资源不是都共享的吗? | 可以用的,如下为《unix网络编程》中的例子: #include "unpthread.h" static void *doit(void *); /* each thread executes this function */ int main(int argc,...
如题,一个进程中的所有资源不是都共享的吗?
|
可以用的,如下为《unix网络编程》中的例子:
#include "unpthread.h"
static void *doit(void *); /* each thread executes this function */
int
main(int argc, char **argv)
{
int listenfd, connfd;
socklen_t addrlen, len;
struct sockaddr *cliaddr;
if (argc == 2)
listenfd = Tcp_listen(NULL, argv[1], &addrlen);
else if (argc == 3)
listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
else
err_quit("usage: tcpserv01 [ ] ");
cliaddr = Malloc(addrlen);
for ( ; ; ) {
len = addrlen;
connfd = Accept(listenfd, cliaddr, &len);
Pthread_create(NULL, NULL, &doit, (void *) connfd);
}
}
static void *
doit(void *arg)
{
Pthread_detach(pthread_self());
str_echo((int) arg); /* same function as before */
Close((int) arg); /* we are done with connected socket */
return(NULL);
}
|
俺一般都不跨线程使用套接字
这个也不太了解
Linux 和 Windows不一样 不能简单说 所有资源都共享
确实Clone的标志是
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGNAL
| CLONE_SETTLS | CLONE_PARENT_SETTID
| CLONE_CHILD_CLEARTID | CLONE_SYSVSEM
也就是共享虚地址空间 文件系统 文件描述符表,但是fork子进程时 CLONE_FS | CLONE_FILES 这两也有,也就是
fork之前的 比如套接字 或者其他文件描述符是 共有的 都能用 但是 fork之后 父进程再打开的 文件描述符 子进程就不可以了。
基本线程也就比子进程多 CLONE_VM 这一个标志位。 所以。。。 (不敢确定,希望有更好的解释吧)
这个也不太了解
Linux 和 Windows不一样 不能简单说 所有资源都共享
确实Clone的标志是
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGNAL
| CLONE_SETTLS | CLONE_PARENT_SETTID
| CLONE_CHILD_CLEARTID | CLONE_SYSVSEM
也就是共享虚地址空间 文件系统 文件描述符表,但是fork子进程时 CLONE_FS | CLONE_FILES 这两也有,也就是
fork之前的 比如套接字 或者其他文件描述符是 共有的 都能用 但是 fork之后 父进程再打开的 文件描述符 子进程就不可以了。
基本线程也就比子进程多 CLONE_VM 这一个标志位。 所以。。。 (不敢确定,希望有更好的解释吧)
|
最好能举个 pthread_create之后 主线程 再socket 然后能在子线程使用的例子
|
线程也有自己局部的栈的,虽然他们可以共享到全局的数据。
一般的做法是建个全局的int fd[]数组,来获取。
或者可以在pthread_create的时候,把fd传进去。
可以看看unix网络编程实例,都有典型模型的例子。
一般的做法是建个全局的int fd[]数组,来获取。
或者可以在pthread_create的时候,把fd传进去。
可以看看unix网络编程实例,都有典型模型的例子。
|
heap 的空间是共享的,
stack 的空间不是共享的。
也就是说全局变量共享, 局部变量不共享。
stack 的空间不是共享的。
也就是说全局变量共享, 局部变量不共享。