当前位置:  技术问答>linux和unix

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

    来源: 互联网  发布时间:2016-10-05

    本文导语:  while(1)              {    /*提示连接哪种服务*/   ...   if((chpid = fork()) == 0) {        close(pfd[0]);                        dup2(pfd[1], 5);                        close(pfd[1]);      ...

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的代码,但是没有什么用,请高手赐教

|
按楼主所给的代码片断以及所说的要求,我简单完整了一下代码。
用strace跟踪后,发现主进程是阻塞在select()函数这,用kill -17(SIGCHLD),发现程序也没有从select中跳出来。


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAXLINE 1024
#define MAX(a, b) (a>b?a:b)

#define debug(fmt...) 
do {
fprintf(stdout, "%s[%d] ", __FILE__, __LINE__);
fprintf(stdout, fmt);
}while(0)

void proc()
{
fd_set rset;
int pfd[2];
int maxfdp1;
int nread;
char buff[MAXLINE+1];
pid_t chpid;

pfd[0] = open("p1", O_RDWR);

//while(1)   
{   
if((chpid = fork()) == 0)
{
close(pfd[0]);
dup2(pfd[1], 5);
close(pfd[1]);
execlp("xterm", "xterm", "-e", "cat", ">", "p1", (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){
debug("===== 200 =====n");
break;
}
}
}
}
}

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

int main(int argc, char *argv[])
{
//signal(SIGCHLD, sig_chld);

proc();

return 0;
}


|
刚才试验了一下
lz试试在父进程中首先调用close(pfd[1]);
...
} else {
close(pfd[1]);
FD_ZERO(&rset);
while(1)

    
 
 

您可能感兴趣的文章:

  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • 多个进程共用一个信号量,如果某个进程死掉,此时又将信号量锁定,其它进程就死掉,有什么办法可以解决这一问题
  • 如何实现子进程根据父进程的信号来确定是否终止子进程???
  • 非进程所有者如何向该进程发送信号
  • 一个进程可以屏蔽另一个进程对信号的响应吗?
  • 信号灯同步2个进程,一个进程如何主动给另一个进程发送通知?
  • 如何确定信号的来源?即如何知道接收到的信号来自于哪一个进程号?
  • 子进程为什么没有继承父进程的信号
  • 父进程与子进程的信号屏蔽表可以不一样吗?
  • 请教关于Kill向子进程发送信号的问题,子进程如何相应信号,为什么子进程接受不到。
  • 书上说,中断用自旋锁,进程,用信号量,但是,为什么中断不能用信号量?
  • 学习linux的新手问:linux进程信号掩码以及信号阻塞与信号未决怎么理解?
  • 新手提问:父进程结束时子进程会得到什么样的从系统发来的信号?
  • 生产者消费者问题为什么不可以共用一个信号量,如果这个信号量可以设置取值固定为0到N,即当信号量取值为N的时候阻塞进程,是否也可以?
  • 【求助】多进程中 内核信号量无效?
  • linux中 关于 进程和信号的问题
  • 进程间信号通信问题
  • 守护进程为什么要忽略SIGHUP信号呢?
  • 如何向由fork出来的进程家族发送信号?
  • 某daemon进程运行一段时间后接受到不知何地的终止信号导致进程退出,何解?
  • 父进程等待子进程n秒,如果子进程正常退出,父进程立即继续向下执行,如果子出现进程故障一直不退出,父进程等待n秒后继续向下执行,请问
  • 进程Afork进程B,进程Bfor进程C,如果进程C退出发出SIGCHLD,A进程是否可以收到
  • linux命令如何实现重启父进程而不会使其子进程退出
  • 父进程退出后子进程的问题
  • 如何解决程序自己调用自已后结束进程,并且父进程能真的退出不成为僵尸进程?
  • 在多进程中父进程frok子进程,怎样让子进程自举,脱离父进程,而且父进程不退出
  • 多进程mmap同一个文件,当一个进程退出时,是否需要unmap
  • shell进程退出,其子进程怎样才能不死,交给init进程管,谢谢,请指点下我写的程序
  • 主进程退出怎么同时也吧开的子进程关掉啊
  • 关于父,子,孙进程的创建和退出问题?????(用system v信号量集)
  • 进程定时退出的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux僵尸(zombie)进程介绍及清除
  • 如果一个server进程要fork许多子进程,但不等待子进程终止,也不希望子进程结束后处于僵进程状态直到父进程终止。请问可采用什么方法实现
  • Ubuntu查看内存,进程相关命令介绍
  • fock()开出的子进程的进程ID是否进程ID都大于父进程的?
  • linux下进程占用内存空间详解
  • 多进程问题 子进程读取内容 读完挂起,父进程写 写入后唤醒子进程
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • 一个进程首先监听一个端口,等到有连接了就新开一个进程,让新进程来处理后面的通讯。请问母进程中已经打开了端口,子进程怎么来使用同一
  • android 4.0 托管进程介绍及优先级和回收机制
  • 我在一个父进程中,生成了4个子进程,子进程的优先级是一样的。我现在想结束子进程。该如何做?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 子进程wait/waitpid//子进程不结束,父进程会等待子进程吗?
  • 在一个进程中我定义了几个全局变量,然后我又fork了几个子进程,子进程中是否可以各自对全局变量进行修改,如果各子进程都对其进行修改,
  • 怎样一次杀掉父进程创建的所有子进程?我在父进程中用kill(0,SIGKILL),结果父进程也给干掉了,参数0难道不是表示除自己外的所有同uid的进
  • 进程创建进程组后,然后创建该组中的进程,然后终止。这里的终止....?
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • 如何通过进程号获得进程的一些信息,例如:进程运行的目录
  • 【如何彻底杀死子进程】Kill -9子进程后进程呈僵死状态
  • fork 一个字进程 将子进程的输出作为主进程的输入
  • 怎么启动一个进程会在进程列表中显示出多个同名进程?
  • 主进程有两个线程,fork子进程后复制主进程两个线程的内存么?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3