【问题标题】:chat program fork seem not to receive messages聊天程序fork好像收不到消息
【发布时间】:2020-07-15 21:03:03
【问题描述】:

我正在尝试编写一个简单的聊天程序。这个想法基本上很简单,两个文件包含消息,这似乎工作正常。问题出在 fork 系统调用中。接收方的文件未显示。 ChildProcess 要么过早终止,要么存在一些我不认识的其他问题。

#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

char MyName[256], RecName[256]; 
int  Over=0;

int  SendMsg (char* name)
{
FILE *file;
char BufText[1000]; 
int  n=0;
char sign;
    fflush(stdin);              
    printf("To %s: ", name);
    n=0;
    do {
        sign=getchar();      
        BufText[n++]=sign;
        if(n>=998) break;    
    }while(sign!='\n');      
    
              
   BufText[n]=0;                
   if(BufText[0]!='\n') {       
        file = fopen(name,"a"); 
                                    
        if(file!=NULL) {            
                                    
            fwrite(BufText, sizeof(char), strlen(BufText), file); 
            fflush(file);  
            fclose(file);
        }
        else return -1; 
    }
    else {
       return 0;   
                   
    }
    return 1;
}

int  ReceiveMsg(char* name)
{
FILE *file;
char sign;
int result =0;
    file=fopen(MyName,"r"); 
    if(file) {
        if(fread(&sign,sizeof(char),1,file)==1)  { 
            result=1;                               
            printf("From %s: ", name);                  
            printf("%c",sign);                         
            while(fread(&sign,sizeof(char),1,file)==1) {  
                printf("%c",sign);
            }
            file = freopen(name,"w",file);    
        }
        fclose(file);                     
        return result;
    }
    return result;
}

void  ChildProcess(void)
{
    int receive;
    do {
        receive = ReceiveMsg(MyName);
        sleep(1);      
    }while (receive == 1); 
}

void  ParentProcess(void)
{
    int result;
    do {
        result = SendMsg (RecName);
    }while(result != 0);
    
    
}

int main(int argc, char* argv[])
{
 pid_t  pid;
    if(argc>1) strcpy(MyName, argv[1]);
    else {
        printf("Your name ?: ");
        scanf("%s",MyName);
    }
    if(argc>2) strcpy(RecName, argv[2]);
    else {
        printf("Recipient ?: ");
        scanf("%s",RecName);
    }

     pid = fork();
     if (pid == 0) 
          ChildProcess();
     else 
          ParentProcess(); 
     return 0;
}

【问题讨论】:

  • 您是否进行过任何调试?例如在调试器中运行您的程序和/或添加更多调试打印语句来跟踪程序正在做什么?如果有,你发现了什么? How to debug small programs

标签: c linux fork


【解决方案1】:

它可能会或可能不会导致您的特定问题,但是...
在您的代码中使用fwrite() 应该传递正在传递的缓冲区的全长,但传递的是短一个字节...

尝试改变这个:

fwrite(BufText, sizeof(char), strlen(BufText), file);

到任一

fwrite(BufText, sizeof(char), sizeof(BufText), file);

fwrite(BufText, sizeof(char), strlen(BufText) + 1, file);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2016-11-10
    • 2019-05-02
    相关资源
    最近更新 更多