linux 多线程问题

w651134 2013-04-12 12:29:30
大家好:
我在移植socket服务程序的时候遇见了这个问题,就是我创建了多个子线程。但是我把子线程退出就会出现主线程和所有子线程同时退出。我在我自己的电脑上面用ubuntu运行了没有这个问题。我移植到我的平台上面就出现这个问题了。这个是源代码
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <fcntl.h>
#include <unistd.h>
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <sys/stat.h>
#include <pthread.h>

#define SERVER_PORT 8090
#define LISTEN_QUEUE_LENGTH 20
#define BUFFER_SIZE 1024
#define MAX_THREAD_NUM 100

int thread_count = 0;
pthread_t threads[MAX_THREAD_NUM];

/**
*
* @param conn_socket
*/
void recv_data(int conn_socket);


/*
*
*/
int main(int argc, char** argv)
{
// œšÁ¢Socket
int server_socket = socket(PF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
printf("Socket create failed.\n");
return EXIT_FAILURE;
}

{
int opt = 1;
setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof (opt));
}


struct sockaddr_in server_addr;
bzero(&server_addr, sizeof (server_addr));

server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);

if (bind(server_socket, (struct sockaddr*) &server_addr, sizeof (server_addr)))
{
printf("Bind port %d failed.\n", SERVER_PORT);
return EXIT_FAILURE;
}


if (listen(server_socket, LISTEN_QUEUE_LENGTH))
{
printf("Server Listen Failed!");
return EXIT_FAILURE;
}


bzero(&threads, sizeof(pthread_t) * MAX_THREAD_NUM);
while (1)
{
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
printf("Server Recieve accept\n");

int client_conn = accept(server_socket, (struct sockaddr*) &client_addr, &length);
if (client_conn < 0)
{
printf("Server Accept Failed!\n");
return EXIT_FAILURE;
}


int pthread_err = pthread_create(threads + (thread_count++), NULL, (void *)recv_data, (void *)client_conn);
if (pthread_err != 0)
{
printf("Create thread Failed!\n");
return EXIT_FAILURE;
}
pthread_join(threads + thread_count,NULL);

}
close(server_socket);
return (EXIT_SUCCESS);
}

void recv_data(int conn_socket)
{
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);

int length = 0;
while (length = recv(conn_socket, buffer, BUFFER_SIZE, 0))
{
if (length < 0)
{
printf("Server Recieve Data Failed! code %d\n", length);
}
printf("Server Recieve Data%s\n", buffer);
bzero(buffer, BUFFER_SIZE);
}
close(conn_socket);
}
...全文
420 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
w651134 2013-04-23
  • 打赏
  • 举报
回复
问题已经搞定了,没有使用多线程,就只是用selecte就可以了
tommwq 2013-04-16
  • 打赏
  • 举报
回复
没处理过real-time signal。 问题搞定了吗? 求科普。
w651134 2013-04-16
  • 打赏
  • 举报
回复
引用 21 楼 tommwq 的回复:
[pid 1936] kill(1937, SIGRT_1 <unfinished ...> [pid 1937] <... recv resumed> 0x7f7ff930, 1024, 0) = ? ERESTARTSYS (To be restarted) [pid 1936] <... kill resumed> ) = 0 [pid ……
是的
w651134 2013-04-16
  • 打赏
  • 举报
回复
引用 23 楼 tommwq 的回复:
没处理过real-time signal。 问题搞定了吗? 求科普。
没有搞定。还在继续找问题。
tommwq 2013-04-16
  • 打赏
  • 举报
回复
[pid 1936] kill(1937, SIGRT_1 <unfinished ...> [pid 1937] <... recv resumed> 0x7f7ff930, 1024, 0) = ? ERESTARTSYS (To be restarted) [pid 1936] <... kill resumed> ) = 0 [pid 1937] --- SIGRT_1 (Unknown signal 33) @ 0 (0) --- [pid 1937] exit(0) = ? Process 1937 detached 是SIGRT_1和SIGRT_0的导致的吧?SIGRT_0和SIGRT_1是SquashFS特有的信号吧?
w651134 2013-04-15
  • 打赏
  • 举报
回复
这个是在ubuntu12.10上面运行的,都是同样的程序: $ strace -f ./socket_demo execve("./socket_demo", ["./socket_demo"], [/* 50 vars */]) = 0 brk(0) = 0x83b5000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d4000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=84322, ...}) = 0 mmap2(NULL, 84322, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb77bf000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/i386-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p[\0\0004\0\0\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=124663, ...}) = 0 mmap2(NULL, 107008, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb77a4000 mmap2(0xb77bb000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x16) = 0xb77bb000 mmap2(0xb77bd000, 4608, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb77bd000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\226\1\0004\0\0\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1730024, ...}) = 0 mmap2(NULL, 1743580, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb75fa000 mprotect(0xb779d000, 4096, PROT_NONE) = 0 mmap2(0xb779e000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1a3) = 0xb779e000 mmap2(0xb77a1000, 10972, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb77a1000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb75f9000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb75f8000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb75f86c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xb779e000, 8192, PROT_READ) = 0 mprotect(0xb77bb000, 4096, PROT_READ) = 0 mprotect(0x8049000, 4096, PROT_READ) = 0 mprotect(0xb77f7000, 4096, PROT_READ) = 0 munmap(0xb77bf000, 84322) = 0 set_tid_address(0xb75f8728) = 29592 set_robust_list(0xb75f8730, 0xc) = 0 futex(0xbfadcb34, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, b75f86c0) = -1 EAGAIN (Resource temporarily unavailable) rt_sigaction(SIGRTMIN, {0xb77a9570, [], SA_SIGINFO}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0xb77a95f0, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0 uname({sys="Linux", node="wsl-Aspire-4738G", ...}) = 0 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 bind(3, {sa_family=AF_INET, sin_port=htons(8090), sin_addr=inet_addr("0.0.0.0")}, 16) = 0 listen(3, 20) = 0 fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77d3000 write(1, "Server Recieve accept\n", 22Server Recieve accept ) = 22 accept(3, {sa_family=AF_INET, sin_port=htons(1221), sin_addr=inet_addr("192.168.8.138")}, [16]) = 4 mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xb6df7000 brk(0) = 0x83b5000 brk(0x83d6000) = 0x83d6000 mprotect(0xb6df7000, 4096, PROT_NONE) = 0 clone(Process 29633 attached child_stack=0xb75f7464, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb75f7ba8, {entry_number:6, base_addr:0xb75f7b40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb75f7ba8) = 29633 [pid 29633] set_robust_list(0xb75f7bb0, 0xc <unfinished ...> [pid 29592] write(1, "Server Recieve accept\n", 22 <unfinished ...> [pid 29633] <... set_robust_list resumed> ) = 0 Server Recieve accept [pid 29633] recv(4, <unfinished ...> [pid 29592] <... write resumed> ) = 22 [pid 29592] accept(3, {sa_family=AF_INET, sin_port=htons(1222), sin_addr=inet_addr("192.168.8.138")}, [16]) = 5 [pid 29592] mmap2(NULL, 8392704, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_STACK, -1, 0) = 0xb65f6000 [pid 29592] mprotect(0xb65f6000, 4096, PROT_NONE) = 0 [pid 29592] clone(Process 29634 attached (waiting for parent) Process 29634 resumed (parent 29592 ready) child_stack=0xb6df6464, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb6df6ba8, {entry_number:6, base_addr:0xb6df6b40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb6df6ba8) = 29634 [pid 29634] set_robust_list(0xb6df6bb0, 0xc) = 0 [pid 29592] write(1, "Server Recieve accept\n", 22 <unfinished ...> [pid 29634] recv(5, Server Recieve accept <unfinished ...> [pid 29592] <... write resumed> ) = 22 [pid 29592] accept(3, <unfinished ...> [pid 29634] <... recv resumed> "", 1024, 0) = 0 [pid 29634] madvise(0xb65f6000, 8372224, MADV_DONTNEED) = 0 [pid 29634] _exit(0) = ? Process 29634 detached [pid 29633] <... recv resumed> "", 1024, 0) = 0 [pid 29633] madvise(0xb6df7000, 8372224, MADV_DONTNEED) = 0 [pid 29633] _exit(0) = ? Process 29633 detached
w651134 2013-04-15
  • 打赏
  • 举报
回复
引用 18 楼 tommwq 的回复:
引用 10 楼 kzl0629 的回复:linux要求的线程函数是void *fun(void *) 你的是无返回值,不知道有没有影响,建议改回标准的好 一般来说,没有导致系统崩溃(比如windows的bsod)的程序崩溃,应该是可以在程序中捕获的。Linux下的程序崩溃应该是通过信号完成的。
我用strace跟踪了一下,这个是打印出来的消息: # strace -f socket_demo execve("/bin/socket_demo", ["socket_demo"], [/* 6 vars */]) = 0 svr4_syscall() = -1 ERRNO_4090 (Unknown error 4090) stat("/home/wsl/12/source/romfs/etc/ld.so.cache", 0x7fea5b40) = -1 ENOENT (No such file or directory) open("/lib/libc.so.0", O_RDONLY) = 3 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaaf000 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0P\271\0"..., 4096) = 4096 old_mmap(NULL, 942080, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaef000 old_mmap(0x2aaef000, 650436, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2aaef000 old_mmap(0x2abcd000, 8164, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9e000) = 0x2abcd000 old_mmap(0x2abcf000, 22520, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2abcf000 close(3) = 0 munmap(0x2aaaf000, 4096) = 0 open("/lib/libpthread.so.0", O_RDONLY) = 3 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaaf000 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0@5\0\000"..., 4096) = 4096 old_mmap(NULL, 348160, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2abd5000 old_mmap(0x2abd5000, 58920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2abd5000 old_mmap(0x2ac23000, 19696, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xe000) = 0x2ac23000 old_mmap(0x2ac28000, 8176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac28000 close(3) = 0 munmap(0x2aaaf000, 4096) = 0 mprotect(0x2abcd000, 4096, PROT_READ) = 0 mprotect(0x2aaed000, 4096, PROT_READ) = 0 ioctl(0, TIOCNXCL, {B57600 opost isig icanon echo ...}) = 0 ioctl(1, TIOCNXCL, {B57600 opost isig icanon echo ...}) = 0 getpid() = 1935 getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0 setrlimit(RLIMIT_STACK, {rlim_cur=2040*1024, rlim_max=1073741823}) = 0 rt_sigaction(SIGRT_0, {0x4000000, [], SA_STACK|SA_INTERRUPT|SA_NOCLDWAIT|0x2bcda54}, NULL, 16) = 0 rt_sigaction(SIGRT_1, {0x4000000, [], SA_STACK|SA_INTERRUPT|SA_SIGINFO|SA_NOCLDWAIT|0x2bcdb24}, NULL, 16) = 0 rt_sigaction(SIGRT_2, {0x4000000, [], SA_STACK|SA_INTERRUPT|SA_NOCLDWAIT|0x2bcdcd0}, NULL, 16) = 0 rt_sigprocmask(SIG_BLOCK, [RT_0], NULL, 16) = 0 rt_sigprocmask(SIG_UNBLOCK, [RT_1], NULL, 16) = 0 brk(0) = 0x442000 brk(0x443000) = 0x443000 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0 bind(3, {sa_family=AF_INET, sin_port=htons(8090), sin_addr=inet_addr("0.0.0.0")}, 16) = 0 listen(3, 20) = 0 write(1, "Server Recieve accept\n", 22Server Recieve accept ) = 22 accept(3, {sa_family=AF_INET, sin_port=htons(1141), sin_addr=inet_addr("10.10.10.3")}, [16]) = 4 brk(0x445000) = 0x445000 pipe([0, 0]) = 5 clone(Process 1936 attached child_stack=0x4440c0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND) = 1936 [pid 1935] write(6, "\0\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 148) = 148 [pid 1935] rt_sigprocmask(SIG_SETMASK, NULL, [RT_0], 16) = 0 [pid 1935] write(6, "\240x\302*\0\0\0\0\0\0\0\0\264\n@\0\4\0\0\0\0\0\0\200\0"..., 148) = 148 [pid 1935] rt_sigprocmask(SIG_SETMASK, NULL, [RT_0], 16) = 0 [pid 1935] rt_sigsuspend([] <unfinished ...> [pid 1936] rt_sigprocmask(SIG_SETMASK, ~[TRAP RT_1], NULL, 16) = 0 [pid 1936] read(5, "\0\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 148) = 148 [pid 1936] poll([{fd=5, events=POLLIN, revents=POLLIN}], 1, 2000) = 1 [pid 1936] getppid() = 1935 [pid 1936] read(5, "\240x\302*\0\0\0\0\0\0\0\0\264\n@\0\4\0\0\0\0\0\0\200\0"..., 148) = 148 [pid 1936] old_mmap(0x7f7fc000, 16384, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0) = 0x7f7fc000 [pid 1936] clone(Process 1937 attached child_stack=0x7f7ffe00, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|SIGRT_1) = 1937 [pid 1936] kill(1935, SIGRT_0) = 0 [pid 1935] <... rt_sigsuspend resumed> ) = ? ERESTARTNOHAND (To be restarted) [pid 1935] --- SIGRT_0 (Unknown signal 32) @ 0 (0) --- [pid 1935] sigreturn() = ? (mask now [IOT EMT SEGV ALRM TERM CHLD PWR STOP]) [pid 1935] write(1, "Server Recieve accept\n", 22Server Recieve accept ) = 22 [pid 1935] accept(3, <unfinished ...> [pid 1936] poll( <unfinished ...> [pid 1937] getpid() = 1937 [pid 1937] rt_sigprocmask(SIG_SETMASK, [RT_0], NULL, 16) = 0 [pid 1937] recv(4, <unfinished ...> [pid 1935] <... accept resumed> {sa_family=AF_INET, sin_port=htons(1142), sin_addr=inet_addr("10.10.10.3")}, [16]) = 7 [pid 1935] rt_sigprocmask(SIG_SETMASK, NULL, [RT_0], 16) = 0 [pid 1935] write(6, "\240x\302*\0\0\0\0\0\0\0\0\264\n@\0\7\0\0\0\0\0\0\200\0"..., 148) = 148 [pid 1935] rt_sigprocmask(SIG_SETMASK, NULL, [RT_0], 16) = 0 [pid 1935] rt_sigsuspend([] <unfinished ...> [pid 1936] <... poll resumed> [{fd=5, events=POLLIN, revents=POLLIN}], 1, 2000) = 1 [pid 1936] getppid() = 1935 [pid 1936] read(5, "\240x\302*\0\0\0\0\0\0\0\0\264\n@\0\7\0\0\0\0\0\0\200\0"..., 148) = 148 [pid 1936] old_mmap(0x7f5fc000, 16384, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0) = 0x7f5fc000 [pid 1936] clone(Process 1938 attached child_stack=0x7f5ffe00, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|SIGRT_1) = 1938 [pid 1936] kill(1935, SIGRT_0 <unfinished ...> [pid 1935] <... rt_sigsuspend resumed> ) = ? ERESTARTNOHAND (To be restarted) [pid 1936] <... kill resumed> ) = 0 [pid 1935] --- SIGRT_0 (Unknown signal 32) @ 0 (0) --- [pid 1935] sigreturn() = ? (mask now [IOT EMT SEGV ALRM TERM CHLD PWR STOP]) [pid 1935] write(1, "Server Recieve accept\n", 22Server Recieve accept ) = 22 [pid 1935] accept(3, <unfinished ...> [pid 1936] poll( <unfinished ...> [pid 1938] getpid() = 1938 [pid 1938] rt_sigprocmask(SIG_SETMASK, [RT_0], NULL, 16) = 0 [pid 1938] recv(7, <unfinished ...> [pid 1936] <... poll resumed> [{fd=5, events=POLLIN}], 1, 2000) = 0 [pid 1936] getppid() = 1935 [pid 1936] poll( <unfinished ...> [pid 1938] <... recv resumed> "", 1024, 0) = 0 [pid 1938] write(6, " \376_\177\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 148 <unfinished ...> [pid 1936] <... poll resumed> [{fd=5, events=POLLIN, revents=POLLIN}], 1, 2000) = 1 [pid 1938] <... write resumed> ) = 148 [pid 1936] getppid() = 1935 [pid 1936] read(5, " \376_\177\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 148) = 148 [pid 1936] kill(1937, SIGRT_1 <unfinished ...> [pid 1937] <... recv resumed> 0x7f7ff930, 1024, 0) = ? ERESTARTSYS (To be restarted) [pid 1936] <... kill resumed> ) = 0 [pid 1937] --- SIGRT_1 (Unknown signal 33) @ 0 (0) --- [pid 1937] exit(0) = ? Process 1937 detached [pid 1936] --- SIGRT_1 (Unknown signal 33) @ 0 (0) --- [pid 1936] sigreturn() = ? (mask now [IOT EMT SEGV ALRM TERM CHLD PWR STOP]) [pid 1936] kill(1935, SIGRT_1 <unfinished ...> [pid 1935] <... accept resumed> 0x7fea5dd0, [16]) = ? ERESTARTSYS (To be restarted) [pid 1936] <... kill resumed> ) = 0 [pid 1935] --- SIGRT_1 (Unknown signal 33) @ 0 (0) --- [pid 1936] wait4(1937, <unfinished ...> [pid 1935] wait4(1936, Process 1935 suspended <unfinished ...> [pid 1936] <... wait4 resumed> NULL, __WCLONE, NULL) = 1937 [pid 1936] wait4(1935, NULL, __WCLONE, NULL) = -1 ECHILD (No child processes) [pid 1936] kill(1938, SIGRT_0) = 0 [pid 1936] exit(0) = ? Process 1935 resumed Process 1936 detached [pid 1935] <... wait4 resumed> NULL, __WCLONE, NULL) = 1936 [pid 1935] exit(0) = ? Process 1935 detached rt_sigprocmask(SIG_SETMASK, NULL, [RT_0], 16) = 0 rt_sigsuspend([]) = ? ERESTARTNOHAND (To be restarted) --- SIGRT_0 (Unknown signal 32) @ 0 (0) --- sigreturn() = ? (mask now [IOT EMT SEGV ALRM TERM CHLD PWR STOP]) exit(0) = ? Process 1938 detached
tommwq 2013-04-14
  • 打赏
  • 举报
回复
引用 10 楼 kzl0629 的回复:
linux要求的线程函数是void *fun(void *) 你的是无返回值,不知道有没有影响,建议改回标准的好
一般来说,没有导致系统崩溃(比如windows的bsod)的程序崩溃,应该是可以在程序中捕获的。Linux下的程序崩溃应该是通过信号完成的。
RedWolf1999 2013-04-14
  • 打赏
  • 举报
回复
用strace命令跟一下吧。
w651134 2013-04-14
  • 打赏
  • 举报
回复
引用 13 楼 prohibit 的回复:
这两句中的thread_count我觉得应该好好斟酌一下C/C++ code?12345int pthread_err = pthread_create(threads + (<span style="color: #FF0000;">thread_count</span>++), NULL, (void *)recv_data, (void *)client_conn)……
这两句我也看了很多介绍,我也试过很多。都是在平台上面才会出现socket客户端主动断开连接程序就会推出。只有一种方法不会退出,就是我查到客户端主动断开时候我不关闭客户端连接,子线程继续运行。但是这样子线程的资源就得不到释放。到了最后运行速度就会很慢了
w651134 2013-04-14
  • 打赏
  • 举报
回复
引用 8 楼 tommwq 的回复:
引用 4 楼 w651134 的回复:引用 2 楼 heartlesstoanyone 的回复:是不是没有处理SIGPIPE信号啊?对已失效socket fd执行write,就导致SIGPIPE了,如果没有处理,系统默认的就是中止程序执行了。 没有,对失效的socket没有再进行访问了,我在我自己的电脑上面运行就不会出现这个问题 看你的描述,应该是没有打印任何错误……
不能生成core dump
w651134 2013-04-14
  • 打赏
  • 举报
回复
引用 9 楼 fly_qj 的回复:
echo $? 看看退出码是多少。
echo $?出来的就是0,没有运行程序的时候也是0
prohibit 2013-04-14
  • 打赏
  • 举报
回复
这两句中的thread_count我觉得应该好好斟酌一下
int pthread_err = pthread_create(threads + (thread_count++), NULL, (void *)recv_data, (void *)client_conn);
...
                pthread_join(threads + thread_count,NULL);
...
}
w651134 2013-04-14
  • 打赏
  • 举报
回复
因为正常情况下不会退出程序的,只有两种情况才会退出程序。但是socket客户端主动断开连接不会出现程序退出。
w651134 2013-04-14
  • 打赏
  • 举报
回复
引用 8 楼 tommwq 的回复:
引用 4 楼 w651134 的回复:引用 2 楼 heartlesstoanyone 的回复:是不是没有处理SIGPIPE信号啊?对已失效socket fd执行write,就导致SIGPIPE了,如果没有处理,系统默认的就是中止程序执行了。 没有,对失效的socket没有再进行访问了,我在我自己的电脑上面运行就不会出现这个问题 看你的描述,应该是没有打印任何错误……
我看一下,给我的感觉就是程序崩溃了
kzl0629 2013-04-13
  • 打赏
  • 举报
回复
linux要求的线程函数是void *fun(void *) 你的是无返回值,不知道有没有影响,建议改回标准的好
RedWolf1999 2013-04-13
  • 打赏
  • 举报
回复
echo $? 看看退出码是多少。
tommwq 2013-04-12
  • 打赏
  • 举报
回复
引用 4 楼 w651134 的回复:
引用 2 楼 heartlesstoanyone 的回复:是不是没有处理SIGPIPE信号啊?对已失效socket fd执行write,就导致SIGPIPE了,如果没有处理,系统默认的就是中止程序执行了。 没有,对失效的socket没有再进行访问了,我在我自己的电脑上面运行就不会出现这个问题
看你的描述,应该是没有打印任何错误信息进程就退出了。这种情况很可能是进程收到了信号。如果平台可以生成core dump,看一下core dump。如果不能,最好对常见信号进行捕获,看看结果。
w651134 2013-04-12
  • 打赏
  • 举报
回复
引用 6 楼 erhou134 的回复:
你的平台 是什么操作系统?
squashfs这个系统
空的 2013-04-12
  • 打赏
  • 举报
回复
你的平台 是什么操作系统?
加载更多回复(5)

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧