23,222
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fd[2];
pid_t pid;
char get[13];
if(pipe(fd) < -1){
printf("Pipe Error!\n");
return -1;
}
if((pid = fork()) < 0){
printf("Fork Error!\n");
return -1;
}else if(pid > 0){
/* parent */
sleep(1);
printf("P\n");
write(fd[1], "tttttt", 6);
read(fd[0], get, 12);
get[12] = '\0';
printf("read: %s\n", get);
}else{
/* child */
printf("C\n");
write(fd[1], "kkkkkkkkkkkk", 12);
}
}
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
void alrmFunc(int signo)
{
printf("alarm\n");
exit(2);
}
void chldFunc(int signo)
{
pid_t pid;
while(true)
{
pid=waitpid(-1,NULL,WNOHANG);
if(pid==0)
{
break;
}
else if(pid<0)
{
if(errno==ECHILD)
{
break;
}
}
else
{
printf("pid:%d exit!\n",pid);
}
}
}
int main(int argc, char **argv)
{
int fd[2];
pid_t pid;
char get[13];
if(signal(SIGCHLD,chldFunc)==SIG_ERR)
{
perror("signal");
exit(1);
}
if(pipe(fd) < -1){
printf("Pipe Error!\n");
return -1;
}
if((pid = fork()) < 0){
printf("Fork Error!\n");
return -1;
}else if(pid > 0){
/* parent */
if(signal(SIGALRM,alrmFunc)==SIG_ERR)
{
perror("signal");
exit(1);
}
printf("P\n");
write(fd[1], "tttttt", 6);
int n;
alarm(3);
while( (n=read(fd[0], get, 12))>0 )
{
get[n]='\0';
printf("%s",get);
fflush(stdout);
}
//父进程读光父子进程所有数据
//但是父进程阻塞在read,没法close pipe[1]
//所以read也得不到EOF,这就是很纠结的一件事了
//设置read非阻塞说不定运气不好数据没读全就EAGAIN了
//可以使用select pipe[0],设置一个超时值,超时则关闭pipe[1]退出
//这里我在alarm里退出父进程
printf("parent exit\n");
//让父进程退出自动关闭pipe[0] and pipe[1]
}else{
/* child */
printf("C\n");
write(fd[1], "kkkkkkkkkkkk", 12);
}
//子进程退出自动关闭pipe[1],pipe[0].
//但子进程不是唯一的pipe[1]持有者,所有不发送EOF
return 0;
}