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

用无名管道实现进程通信,可是出错了,打击哦

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

    本文导语:  大家好,我在学习linux,想实现两个进程之间的通信,其功能如下: 父进程获取输入的字符串,送入到管道中,然后子进程获取输出。 我的代码入下: int main (int argc, char *argv[]) {     int f_des[2];     char str[10...

大家好,我在学习linux,想实现两个进程之间的通信,其功能如下:
父进程获取输入的字符串,送入到管道中,然后子进程获取输出。

我的代码入下:
int main (int argc, char *argv[])
{
    int f_des[2];
    char str[1024];

    if(pipe(f_des) == -1) //生成无名管道
    {
         perror("pipe error");
         exit(1);
    }
    switch(fork())
    {
         case -1:
              perror ("Fork error");
              exit(2);
         case 0: //子进程
              while(1)
              {
                   close(f_des[1]);
                   if(read(f_des[0],str,1024) != -1) //读取成功
                   {
                       if(strcmp(str,"exit") == 0)
                             exit(0);
                        printf ("Meaage received by Chile:%sn",str);
                        fflush(stdout);
                   }
              }
         default : //父进程
              while(1)
              {
                  scanf ("%s",str); //获取字符串输入
                  close(f_des[0]);
                  if (write(f_des[1],str,strlen(str)) != -1)
                  {
                       printf ("Message sent by parent:%sn",str);
                       fflush(stdout);
                  }
                  if(strcmp(str,"exit") == 0)
                      break;

              }
     }
     exit(0);
}


可当我运行时,子进程从无名管道中读出的信息总是会出错,当我输入exit的时候,它会死循环不停的读出数据,这是为什么呢?
结果如下:
weitch@weitch-desktop:~/linux学习/program$ ./无名管道
hello
Message sent by parent:hello
Meaage received by Chile:hello
csdn
Message sent by parent:csdn
Meaage received by Chile:csdno

第二个就不能正确读取信息了,这是什么呢?我快崩溃了...

|
#include 
#include 
#include 
#include 
int main (int argc, char *argv[])
{
    int f_des[2];
    char str[1024];

    if(pipe(f_des) == -1) //生成无名管道
    {
         perror("pipe error");
         exit(1);
    }
    switch(fork())
    {
         case -1:
              perror ("Fork error");
              exit(2);
         case 0: //子进程
               close(f_des[1]);
              while(1)
              {
                   memset(str,0,1024);//每次读取前要把缓冲区重置为0
                   if(read(f_des[0],str,1024) != -1) //读取成功
                   {
                       if(strcmp(str,"exit") == 0)
                             exit(0);
                        printf ("Meaage received by Child:%sn",str);
                        fflush(stdout);
                   }
              }
         default : //父进程
              close(f_des[0]);
              while(1)
              {
                  scanf ("%s",str); //获取字符串输入
                  if (write(f_des[1],str,strlen(str)) != -1)
                  {
                       printf ("Message sent by parent:%sn",str);
                       fflush(stdout);
                  }
                  if(strcmp(str,"exit") == 0)
                      break;

              }
     }
     exit(0);
}

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 用vim的高手,你们用哪个手指按小括号,中括号,尖括号?感觉都用无名指和小指很费劲啊
  • posix 无名信号量 实现进程间同步 失败 sem_init sem_wait sem_post


  • 站内导航:


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

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

    浙ICP备11055608号-3