23,125
社区成员
发帖
与我相关
我的任务
分享
close(pfd[1]);//差了这一句
FD_ZERO(&rset);
while(1)
{
/*
if(errno == EINTR)
break;
*/
maxfdp1 = max(pfd[0], fileno(stdin)) + 1;
FD_SET(pfd[0], &rset);
FD_SET(fileno(stdin), &rset);
if(select(maxfdp1, &rset, NULL, NULL, NULL) < 0) {
printf("mlgb\n");
/*
if(errno == EINTR) {
break;
}
*/
}
if(FD_ISSET(pfd[0], &rset))
{
if((nread = read(pfd[0], buff, MAXLINE)) > 0)
{
buff[nread] = 0;
fputs(buff, stdout);
}
else if(nread == 0)
break;
/*
else if(nread < 0)
break;
可是检查返回负数无法break,永远不会返回负数?(即永远不会因为阻塞而被sigchld中断?)
*/
}
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 {
close(pfd[1]);
FD_ZERO(&rset);
while(1)
...
} else {
close(pfd[1]);
FD_ZERO(&rset);
while(1)
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#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;
}