主进程select,子进程退出会产生EINTR信号么?
{
/*提示连接哪种服务*/
...
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)的解决方法进行了详细的分析介绍,需要的朋友参考下
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的第二三四个参数表示需要关注读、写、错误事件的文件描述符位数组,这些参数既
select多路复用socket编程
select,socket,C++ select,socket,C++
总结:Linux中socket常见错误分析
并不是所有的系统调用都可以自动恢复。如msgsnd喝msgrcv就是典型的例子,msgsnd/msgrcv以block方式发送/接收消息时,会因为进程收到了信号而中断。此时msgsnd/msgrcv将返回-1,errno被设置为EINTR。且即使在插入信号时设置了SA_RESTART,也无效。
C语言中getopt()函数和select()函数的使用方法
主要介绍了C语言中getopt()函数和select()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下


