Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20610
  • 博文数量: 5
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-18 11:51
文章分类

全部博文(5)

文章存档

2011年(1)

2008年(4)

我的朋友
最近访客

分类: C/C++

2008-07-31 19:50:04

/*
    进程间通信。
    这个程序与聊天程序(一)结构相同,与其相比:优点是一个时间点可以有较多的用户输入窗口,能更好的完成多窗口信息交流;缺点是容易出错,鲁棒性较差。
    希望得到大家的指正!
*/

#include
#include   
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct message_packet
{
    char *name_from;
    char *name_sendto;
    char *msg;
}mp;

int main()
{
    char name_fifo[]="fifo";
    int fd_r,fd_w,i,j=0;
    int rt_mf;
    char buf[300]={'\0','\0','\0'};    
    int rp[3];
    int rt_write,fd_write,rt_wait;
    mp pk_slf;
    pid_t pid;    
    rt_mf=mkfifo(name_fifo,S_IRUSR|S_IWUSR);
    printf("please input your name:");
    gets(buf);
    pk_slf.name_from=(char *)malloc(strlen(buf)+1);
    strcpy(pk_slf.name_from,buf);
    pid=fork();
    if(pid==0)
    {
        fd_write=open(name_fifo,O_WRONLY);        
        close(fd_write);
        exit(0);
    }
    sleep(0.5);
    rt_wait=waitpid(pid,NULL,WNOHANG);
    kill(pid,SIGKILL);    
    if(rt_wait==0)
    {        
        for(;;)
        {                
            fd_r=open(name_fifo,O_RDONLY);
            read(fd_r,&buf[0],300);                
            rp[1]=strlen(buf)+1;
            rp[2]=rp[1]+strlen(&buf[rp[1]])+1;    
            close(fd_r);//注意
            if(strcmp(buf,pk_slf.name_from)!=0)
            {
                fd_w=open(name_fifo,O_WRONLY);                        
                write(fd_w,&buf[0],300);
                close(fd_w);
                sleep(0.2);
            }
            else
            {                            
                if(strlen(&buf[rp[1]])!=0)
                {
                    printf("message frome %s:%s\n\n",&buf[rp[1]],&buf[rp[2]]);
                    break;
                }
            }        
            
        }
    }
       
    for(;;)
    {                       
        fd_w=open(name_fifo,O_WRONLY);       
        printf("who do you want to talk:");
        gets(buf);
        pk_slf.name_sendto=(char *)malloc(strlen(buf)+1);
        strcpy(pk_slf.name_sendto,buf);       
        printf("%s:",pk_slf.name_from);       
        gets(buf);
        pk_slf.msg=(char *)malloc(strlen(buf)+1);
        strcpy(pk_slf.msg,buf);
        strcpy(buf,pk_slf.name_sendto);
        strcpy(&buf[strlen(buf)+1],pk_slf.name_from);
        strcpy(&buf[(strlen(buf)+1)+(strlen(&buf[strlen(buf)+1])+1)],pk_slf.msg);
        rt_write=write(fd_w,&buf[0],300);           
        close(fd_w);//注意
        for(;;)
        {
            fd_r=open(name_fifo,O_RDONLY);
            read(fd_r,&buf[0],300);               
            rp[1]=strlen(buf)+1;
            rp[2]=rp[1]+strlen(&buf[rp[1]])+1;   
            close(fd_r);//注意
            if(strcmp(buf,pk_slf.name_from)!=0)
            {
                fd_w=open(name_fifo,O_WRONLY);                       
                write(fd_w,&buf[0],300);
                close(fd_w);
                sleep(0.2);
            }
            else
            {
                printf("message frome %s:%s\n\n",&buf[rp[1]],&buf[rp[2]]);
                break;
            }
           
        }       
    }   
    exit(0);
}
阅读(1830) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-08-16 21:14:09

ctalk.c:(.text+0x84): warning: the `gets' function is dangerous and should not be used. 这是C语言里面gets函数的一个不足之处,如果你得字符超出了gets,那麽就会产生一个溢出。

zhxiong.linux2008-08-02 09:58:28

这是一个关于进程间通信的程序,也就是在同一台电脑上打开多个窗口,每个窗口都运行这个程序,创造多个进程,窗口之间可以交互信息,完成进程间的通信。其实没有多大的实用性,就玩玩而已,呵呵,这两个程序对错误输入的处理还有待解决,程序(一)相对于程序二运行地要好一些,你可以试试。

金口袋2008-07-31 22:45:30

/tmp/ccQw8ow1.o: In function `main': ctalk.c:(.text+0x84): warning: the `gets' function is dangerous and should not be used. 没错也没有警告而有上面的 不知道你这个程序如何用 [gaowei@localhost gocoso]$ ./ctalk please input your name:hao who do you want to talk:hao hao:hao [gaowei@localhost gocoso]$ 就这样就结束了,对吗?