主进程select,子进程退出会产生EINTR信号么?

arrow0815 arrow0815 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
while(1)
{
/*提示连接哪种服务*/
...
if((chpid = fork()) == 0)
{
close(pfd[0]);
dup2(pfd[1], 5);
close(pfd[1]);
execlp("xterm", "xterm", "-e", "./echo_cli", addr, (char *) 0);

} else {
FD_ZERO(&rset);
while(1)
{
maxfdp1 = max(pfd[0], fileno(stdin)) + 1;
FD_SET(pfd[0], &rset);
FD_SET(fileno(stdin), &rset);
select(maxfdp1, &rset, NULL, NULL, NULL);
if(FD_ISSET(pfd[0], &rset))
{
if((nread = read(pfd[0], buff, MAXLINE)) > 0)
{
buff[nread] = 0;
fputs(buff, stdout);
} else break;
}
if(FD_ISSET(fileno(stdin), &rset))
{
if((nread = read(fileno(stdin), buff, MAXLINE)) > 0)
fputs("Do not type in the parent window!\n", stdout);

}
else
{
if(errno == EINTR)
break;
}
}
}

void
sig_chld(int signo)
{
pid_t pid;
int stat;
char buff[MAXLINE];
while((pid = waitpid(-1, &stat, WNOHANG)) > 0)
{
sprintf(buff, "---Disconnected from server...---\n");
fputs(buff, stdout);
}
return;
}

我写了一个socket连接的代码,进入子进程后会产生一个xterm窗口与服务器进行通信,我希望在开启xterm窗口后,
1创建一个管道与夫进程通信,传输一些连接信息
2如果在parent继续输入,则会提示Do not type in the parent window!
3xterm通过ctrl D 或 ctrl C退出后,主进程回到外层的while循环继续询问要连接哪种服务


为了做到这三点,定义了信号处理函数来处理SIG_CHLD,一旦子进程退出就会打印---Disconnected from server...并
并在主进程里用select监听管道的输出端pfd[0]和stdin,哪个描述符产生了可读信息就打印


可是现在一旦退出xterm(子进程),父进程窗口就会停在---Disconnected from server...---处,不会返回外层的while(1)循环,我认为此时父进程应该还阻塞在为select写的内层while(1)里,可是如何通知主进程子进程已经退出呢?
可以通过判断errno==EINTR么?我在内层while(1)里加了判断errno的代码,但是没有什么用,请高手赐教
...全文

相关推荐

Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法

本篇文章是对在Linux下semop等待信号时出现Interrupted System Call错误(EINTR)的解决方法进行了详细的分析介绍,需要的朋友参考下

weixin_38672962

linux使用select实现精确定时器详解

在编写程序时,我们经常会用到定时器。首先看看select函数原型如下: 代码如下:int select(int nfds, fd_set *readfds, fd_set *writefds,                  fd_set *exceptfds, struct timeval *timeout);参数说明:slect的第一个参数nfds为fdset集合中最大描述符值加1,fdset是一个位数组,其大小限制为__FD_SETSIZE(1024),位数组的每一位代表其对应的描述符是否需要被检查。select的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既

weixin_38731075

select多路复用socket编程

select,socket,C++ select,socket,C++

阿萨德飞

总结:Linux中socket常见错误分析

并不是所有的系统调用都可以自动恢复。如msgsnd喝msgrcv就是典型的例子,msgsnd/msgrcv以block方式发送/接收消息时,会因为进程收到了信号而中断。此时msgsnd/msgrcv将返回-1,errno被设置为EINTR。且即使在插入信号时设置了SA_RESTART,也无效。

weixin_38553648

C语言中getopt()函数和select()函数的使用方法

主要介绍了C语言中getopt()函数和select()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下

weixin_38707342
评论 16
收藏 已收藏
分享
返回顶部
arrow0815
Linux/Unix社区 23,224 成员 74,535 内容