免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2236 | 回复: 7
打印 上一主题 下一主题

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-05-30 10:18 |只看该作者 |倒序浏览
下面是我用FIFO写的子进程间通信的程序,主要实现先创建子进程1,执行完之后发信号给父进程,父进程再创建子进程2,然后实现2者之间的通信。但运行结果是could not open fifo,这是为什么呢?是不是子进程1结束了,就不能实现通信啦?请问错在哪里?
  1. #include<stdio.h>;
  2. #include<stdlib.h>;
  3. #include<fcntl.h>;
  4. #include<sys/types.h>;
  5. #include<sys/stat.h>;
  6. #include<limits.h>;
  7. #include<unistd.h>;
  8. #include"err_exit.h"
  9. #define FIFO_FILE "myfifo"

  10. static pid_t child_id[1];
  11. static int myfifo1(void);
  12. static int myfifo2(void);
  13. static int fifo_fd,n;
  14. static char buffer[BUFSIZ+1];
  15. static char some_data[]="hello,world!";
  16. void sig_usr(int signo)/*信号SIGUSR1的句柄*/
  17. {   
  18.    
  19.         printf("received SIGUSR1 \n");
  20.            /*创建新的子进程2*/
  21.            child_id[1]=fork();
  22.            if(child_id[1]==0)
  23.               {  
  24.             /*自己定义的进程通信函数*/
  25.                       myfifo1();
  26.                       myfifo2();                     
  27.                 /*子进程2的功能*/
  28.                       child_function2();                     
  29.       
  30.                 exit(0);
  31.               }
  32.            else if(child_id[1]<0)
  33.                printf("fork error.");               
  34. }

  35. /*子进程执行此函数*/
  36. int child_function1()
  37. {
  38.       printf("this is child1:\n");
  39.       printf("done1.\n");
  40.       /*发出信号通知父进程子进程1已完成*/
  41.       kill(getppid(),SIGUSR1);
  42.       exit(EXIT_SUCCESS);
  43.       return 0;
  44. }

  45. int  child_function2()
  46. {     
  47.       printf("this is child2:\n");
  48.       printf("Done2.\n");
  49.       exit(EXIT_SUCCESS);
  50.       return 0;
  51. }

  52. int main(int argc, char *argv[])
  53. {   
  54.                
  55.       int i;
  56.       int status;     
  57.       struct sigaction usr_action;
  58.       sigset_t block_mask;
  59.       /*初始化信号句柄*/
  60.       sigfillset(&block_mask);
  61.       usr_action.sa_handler=sig_usr;/*指定与信号相关连的动作*/
  62.       usr_action.sa_mask=block_mask;
  63.       usr_action.sa_flags=0;
  64.       /*为信号SIGUSR1*/
  65.       sigaction(SIGUSR1,&usr_action,NULL);   
  66.            
  67.                         
  68.       /*创建子进程1*/  
  69.       child_id[0]=fork();
  70.       if(child_id[0]==0)
  71.           { child_function1();  
  72.             exit(0); }  
  73.       else if(child_id[0]<0)
  74.           printf("fork error.");                                                               
  75.                   
  76.       /*父进程*/
  77.       for(i=0;i<2;i++)
  78.          waitpid(child_id[i],&status,0);
  79.       printf("data sending is over.\n");
  80.       exit(EXIT_SUCCESS);
  81. }
  82. int myfifo2(void)
  83. {
  84.      
  85.      if(access(FIFO_FILE,F_OK)==-1)
  86.          {  if(mkfifo(FIFO_FILE,0666)!=0)
  87.               {
  88.                       printf("could not create fifo %s\n",FIFO_FILE);
  89.                       exit(EXIT_FAILURE);
  90.               }
  91.          }
  92.       if((fifo_fd=open(FIFO_FILE,O_RDONLY))<0)
  93.          {
  94.              printf("could not open fifo %s\n",FIFO_FILE);
  95.              exit(EXIT_FAILURE);
  96.          }       
  97.        printf("child2 %d opened:%s\n",getpid(),FIFO_FILE);
  98.        while((n=read(fifo_fd,buffer,BUFSIZ))>;0)
  99.               printf("child2 %d received %d bytes:%s\n",getpid(),n,buffer);
  100.        close(fifo_fd);
  101.        printf("child2 %d received %d bytes then finished\n",getpid(),n);
  102.        return 0;
  103. }
  104. int myfifo1(void)
  105. {
  106.      int fifo_fd,n;
  107.      char buffer[BUFSIZ+1];
  108.      char some_data[]="hello,world!";
  109.      if((fifo_fd=open(FIFO_FILE,O_WRONLY))<0)
  110.          {
  111.                  printf("could not open fifo %s\n",FIFO_FILE);
  112.                  exit(EXIT_FAILURE);
  113.          }
  114.      printf("child1 %d opened:%s\n",getpid(),FIFO_FILE);
  115.      if(n=write(fifo_fd,some_data,strlen(some_data))==-1)
  116.               err_exit("FIFO broken");
  117.      printf("child1 %d write %d bytes\n",getpid(),n);
  118.      close(fifo_fd);
  119.      printf("child1 %d write %d bytes then finished\n",getpid(),n);
  120.      return 0;
  121. }
  122.       
  123.      
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-05-30 10:33 |只看该作者

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教

我没看你的代码,倒是看到了你如下的一句话:
“是不是子进程1结束了,就不能实现通信啦?”

因为FIFO是process persistent,所以如果两个相互通讯的进程中一个结束了(包括正常结束如exit,和异常结束如接受到信号),那么这个FIFO结束了的相关进程的一个端不可用,对于程序设计者而言,看到的现象便是不通讯了。

论坛徽章:
0
3 [报告]
发表于 2003-05-30 10:43 |只看该作者

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教

那我要实现子进程2是在子进程1发信号之后创建,而1还要传一个字符串给2应该怎么办呢?
是不是2个并行的子进程就可以啦?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2003-05-30 10:57 |只看该作者

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教

只要保证2能够找到这个有名管道的一个端读写(另一段由1读写)便可以了。你用两个子进程也可以。但是子进程不是并发的。并发是给你的感觉是这样。事实上1和2根本不可能并发的(在单CPU的环境中)。

论坛徽章:
0
5 [报告]
发表于 2003-05-30 11:05 |只看该作者

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教

它们好像是抢占时间片,所以每次执行的顺序都是随机的,是吗?
只要保证2能够找到这个有名管道的一个端读写(另一段由1读写)便可以了。

这句话我不是很懂?能不能说具体点,谢谢啦

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2003-05-30 11:22 |只看该作者

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教

其实说得通俗一点,就是保证这两个进程操作的是一个FIFO。呵呵

看来,我写的书一定会苦涩难懂!

论坛徽章:
0
7 [报告]
发表于 2003-05-30 11:44 |只看该作者

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教

这句话我懂啦
     斑竹你那么热心帮助我们解决困惑,帮我们提供学习资料,我们都很感谢你
   以后出书了别忘了告诉我们一声,我们一定帮你作宣传提高销售量,再买几本作为收藏啦

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-05-30 12:06 |只看该作者

用FIFO编写的进程之间通信的程序,可是有错误,请高手指教

拷,我是大比方,写书估计这辈子论不到我了。不论是什么书。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP