gpt4 book ai didi

c - SIGPIPE 带运行程序

转载 作者:行者123 更新时间:2023-12-04 12:08:25 24 4
gpt4 key购买 nike

我有两个守护进程,A 正在与 B 通信。B 正在监听一个端口,A 打开一个到该端口的 tcp 连接。 A 能够打开一个到 B 的套接字,但是当它尝试实际写入所述套接字时,我得到一个 SIGPIPE,所以我试图找出 B 可以在哪里关闭打开的套接字。

但是,如果我附加到 gdb 中的两个守护进程,则 SIGPIPE 会在调用任何用于处理数据的代码之前发生。这是有道理的,因为初始写入永远不会成功,并且监听器是从接收数据中触发的。我的问题是 - 什么会导致守护进程 B 在发送任何数据之前关闭套接字?套接字在打开后不到一微秒就关闭了,所以我认为它不可能是超时或类似的事情。我希望能列出一份 list ,列出各种可能性,因为我已经琢磨了好几天了,但我几乎没有主意了。

根据要求,这是接受和处理通信的代码:

{
extern char *PAddrToString(pbs_net_t *);

int i;
int n;

time_t now;

fd_set *SelectSet = NULL;
int SelectSetSize = 0;

int MaxNumDescriptors = 0;

char id[] = "wait_request";
char tmpLine[1024];

struct timeval timeout;

long OrigState = 0;

if (SState != NULL)
OrigState = *SState;

timeout.tv_usec = 0;

timeout.tv_sec = waittime;

SelectSetSize = sizeof(char) * get_fdset_size();
SelectSet = (fd_set *)calloc(1,SelectSetSize);

pthread_mutex_lock(global_sock_read_mutex);

memcpy(SelectSet,GlobalSocketReadSet,SelectSetSize);

/* selset = readset;*/ /* readset is global */
MaxNumDescriptors = get_max_num_descriptors();

pthread_mutex_unlock(global_sock_read_mutex);
n = select(MaxNumDescriptors, SelectSet, (fd_set *)0, (fd_set *)0, &timeout);

if (n == -1)
{
if (errno == EINTR)
{
n = 0; /* interrupted, cycle around */
}
else
{
int i;

struct stat fbuf;

/* check all file descriptors to verify they are valid */

/* NOTE: selset may be modified by failed select() */

for (i = 0; i < MaxNumDescriptors; i++)
{
if (FD_ISSET(i, GlobalSocketReadSet) == 0)
continue;

if (fstat(i, &fbuf) == 0)
continue;

/* clean up SdList and bad sd... */

pthread_mutex_lock(global_sock_read_mutex);
FD_CLR(i, GlobalSocketReadSet);
pthread_mutex_unlock(global_sock_read_mutex);
} /* END for each socket in global read set */

free(SelectSet);

log_err(errno, id, "Unable to select sockets to read requests");


return(-1);
} /* END else (errno == EINTR) */
} /* END if (n == -1) */

for (i = 0; (i < max_connection) && (n != 0); i++)
{
pthread_mutex_lock(svr_conn[i].cn_mutex);

if (FD_ISSET(i, SelectSet))
{
/* this socket has data */
n--;

svr_conn[i].cn_lasttime = time(NULL);

if (svr_conn[i].cn_active != Idle)
{
void *(*func)(void *) = svr_conn[i].cn_func;

netcounter_incr();

pthread_mutex_unlock(svr_conn[i].cn_mutex);

func((void *)&i);

/* NOTE: breakout if state changed (probably received shutdown request) */

if ((SState != NULL) &&
(OrigState != *SState))
break;
}
else
{

pthread_mutex_lock(global_sock_read_mutex);
FD_CLR(i, GlobalSocketReadSet);
pthread_mutex_unlock(global_sock_read_mutex);

close_conn(i, TRUE);

pthread_mutex_unlock(svr_conn[i].cn_mutex);
pthread_mutex_lock(num_connections_mutex);

sprintf(tmpLine, "closed connections to fd %d - num_connections=%d (select bad socket)",
i,
num_connections);

pthread_mutex_unlock(num_connections_mutex);
log_err(-1, id, tmpLine);
}
}
else
pthread_mutex_unlock(svr_conn[i].cn_mutex);
} /* END for i */

/* NOTE: break out if shutdown request received */

if ((SState != NULL) && (OrigState != *SState))
return(0);

/* have any connections timed out ?? */
now = time((time_t *)0);

for (i = 0;i < max_connection;i++)
{
struct connection *cp;

pthread_mutex_lock(svr_conn[i].cn_mutex);

cp = &svr_conn[i];

if (cp->cn_active != FromClientDIS)
{
pthread_mutex_unlock(svr_conn[i].cn_mutex);

continue;
}

if ((now - cp->cn_lasttime) <= PBS_NET_MAXCONNECTIDLE)
{
pthread_mutex_unlock(svr_conn[i].cn_mutex);

continue;
}

if (cp->cn_authen & PBS_NET_CONN_NOTIMEOUT)
{
pthread_mutex_unlock(svr_conn[i].cn_mutex);

continue; /* do not time-out this connection */
}

/* NOTE: add info about node associated with connection - NYI */

snprintf(tmpLine, sizeof(tmpLine), "connection %d to host %s has timed out after %d seconds - closing stale connection\n",
i,
PAddrToString(&cp->cn_addr),
PBS_NET_MAXCONNECTIDLE);

log_err(-1, "wait_request", tmpLine);

/* locate node associated with interface, mark node as down until node responds */
/* NYI */
close_conn(i, TRUE);

pthread_mutex_unlock(svr_conn[i].cn_mutex);
} /* END for (i) */

return(0);
}

注意:这段代码不是我写的。

最佳答案

有没有可能你搞砸了,在程序的其他地方你试图关闭同一个句柄两次?

这很容易对你造成影响。

提示:systrace 可以确定这是否正在发生。

关于c - SIGPIPE 带运行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8040945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com