QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1340|回复: 10

超紧急的关于管道的问题,各位大侠帮帮忙!!!

[复制链接]
发表于 2005-6-15 22:05:25 | 显示全部楼层 |阅读模式
我现在要在父子进程之间通信,用管道,可是,我发现我在子进程中的一个循环里将数据写入管道,在父进程中将数据读出管道,现在问题是,我子进程中的每一次循环需要好几秒,也就是说,每写入管道一次就要等待好几秒才写第二次,可是,在读数据的时候,却只能读到第一次的数据,之后就没有再继续读了???为什么???是不是在读数据的时候也需要什么循环,判断是否管道中还有数据没有读???该怎么做呢???着急呀~>_<~
发表于 2005-6-15 22:08:25 | 显示全部楼层
可以发信号给父进程启动父进程读。
回复

使用道具 举报

 楼主| 发表于 2005-6-16 09:57:44 | 显示全部楼层
可是,他应该是自己自动读取吧?我做了一个小程序,就是在子进程里做一百个加法循环,每次加一之后就写进管道,然后在父进程里读取,也没有发信号,为什么就可以把全部的内容读出来呢???请指教!!!~>_<~ 急呀!!!!!!!!!
回复

使用道具 举报

发表于 2005-6-16 10:44:30 | 显示全部楼层
那要看父进程读的时候管道里有什么,会全读出来。读过这次之后是不会自动再读的。
回复

使用道具 举报

 楼主| 发表于 2005-6-17 16:57:11 | 显示全部楼层
我现在问题的关键就是想让父进程在每次我写入新数据的时候他都能调用读管道,该怎么做呢?
回复

使用道具 举报

发表于 2005-6-17 18:48:25 | 显示全部楼层
[quote:fbe7fa23e6="sagaeon"]可以发信号给父进程启动父进程读。[/quote]
回复

使用道具 举报

发表于 2005-6-17 21:59:35 | 显示全部楼层
[quote:b5999117ae="sagaeon"][quote:b5999117ae="sagaeon"]可以发信号给父进程启动父进程读。[/quote][/quote]
回复

使用道具 举报

 楼主| 发表于 2005-6-19 12:36:03 | 显示全部楼层
可是,我尝试在每次子进程写入管道之后就发信号给父进程,然后在父进程中接收,可是父进程好像没有变化呀
我的程序:
子进程中utput=write(mypipe[1],wfString,strlen(wfString));
         kill(getppid(), SIGALRM);
父进程中: (void)signal(SIGALRM, ding);
其中:
void ding(int sig)
{
  output=read(mypipe[0],buffer,BUFSIZ);
  printf("Read %d bytes:%s\n",output,buffer);
  medit->insertLine(buffer);
}
可是,现在没有任何输出,是不是要在(void)signal(SIGALRM, ding);之后加一个pause();呀,可是加了之后就会一直死机!!!55555555555555555
回复

使用道具 举报

 楼主| 发表于 2005-6-19 12:37:16 | 显示全部楼层
[quote:5e1c6c9e07="sagaeon"][quote:5e1c6c9e07="sagaeon"]可以发信号给父进程启动父进程读。[/quote][/quote]


具体怎么做, 能简单介绍一下吗???多谢啦!!!
回复

使用道具 举报

发表于 2005-6-19 16:18:50 | 显示全部楼层
[code:1]#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void ding (int sig)
{
  printf("in the father--Ding\n");

  printf("done\n");

}

int main()
{
  pid_t pid;
  printf ("alarm appliction starting \n");
  int data_processed;
  int file_pipes[2];
  const char some_data[]="123";
  char buffer[256];
  memset (buffer, '\0',sizeof(buffer));

  if (pipe(file_pipes) == 0 ){

  pid = fork();
  switch (pid){
  case -1:
    perror("fork failed");
    exit(1);
  case 0:
    while( 1 ) {
    sleep(2);
    data_processed = write(file_pipes[1],some_data,strlen(some_data));
    printf("I'm in the child--Wrote %d bytes \n",data_processed);
    kill(getppid(),SIGALRM);
    }
    exit(0);
  }

  printf("ok,let's go\n");
  (void) signal(SIGALRM,ding);

  while( 1) {pause();};
  }
  exit(0);
}
[/code:1]注意在有信号时会跳出pause
回复

使用道具 举报

 楼主| 发表于 2005-6-21 11:59:52 | 显示全部楼层
问题解决了,谢谢sagaeon !!!*^_^*
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 19:30 , Processed in 0.098904 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表