简体   繁体   English

检查从其他进程获取的字符串时,进程崩溃

[英]Process crashes while checking string recived from other process

I making a some kind of project. 我正在做某种项目。 Program need to create 3 processes. 程序需要创建3个进程。 1st one is getting a string from user, the model is: 'number1+number2+..+numbern'. 第一个是从用户那里获取字符串,模型是:'number1 + number2 + .. + numbern'。 After that it send string to 2nd process. 之后,它将字符串发送到第二进程。 2nd process is checking that user send a valid (with model) string and send it to 3rd process if it is okey 3rd process sums 'numbers' and print it on a screen. 第二个过程是检查用户是否发送了有效的(带有模型)字符串,如果字符串正确,则将其发送给第三个过程。第三个过程将“数字”加起来并打印在屏幕上。

I already did fully working 1st process, and trying to do 2nd one to work well with 1st one. 我已经完全完成了第一个流程的工作,并尝试做第二个流程以与第一个流程很好地协同工作。 Sadly, 2nd process crashes after: printf("Zaczynam sprawdzanie poprawnosci wyrazenia: %s\\n", kom.mtext); 可悲的是,第二个进程在以下时间后崩溃: printf("Zaczynam sprawdzanie poprawnosci wyrazenia: %s\\n", kom.mtext);

Can u help me to figure out what im doing wrong? 您能帮我弄清楚我做错了什么吗? why 2nd process stops? 为什么第二个进程停止? Thanks in advance 提前致谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h> 

struct msgbuf {
   long mtype;
   char mtext[255];
};

struct msqid_ds buf;

 int main(int argc, char **argv) 
{
int ch, i, pid1=getpid(), pid2, pid3;

struct msgbuf kom;

if(argc != 1) 
{
    printf("\nProgram nie wymaga zadnych parametrow!\n");
}

ch = msgget(1000, IPC_CREAT|0666);

if((pid3 = fork()) == 0) 
{

}
else
{
    if((pid2 = fork()) == 0)
    {
        while(1)
        {   
            char tabliczb[25][20];
            int i=1, j=0, k=0, poprawny=1, liczba_znak=0;
            char liczba[20]="";
            if(msgrcv(ch, &kom, 512, getpid(), 0) < 0) 
                break;
            printf("\nProces 2-gi PID: %d, odebral wyrazenie: %s\n", getpid(),kom.mtext);
            if(kom.mtext[0] == '#')
                break;
            printf("Zaczynam sprawdzanie poprawnosci wyrazenia: %s\n", kom.mtext);
            if (kom.mtext[0] >= '0' && kom.mtext[0] <= '9')
            {
                liczba_znak = 0;
                liczba[j] = kom.mtext[0];
                j++;
            }
            else
            {
                printf("Wyrazenie musi zaczynac sie od liczby!\n");
                poprawny=0;
                break;
            }
            printf("\n3kom.text[%d]= %c", i, kom.mtext[i]);  //WHY THIS IS NOT PRINTING ANYTHING?
            while(kom.mtext[i] != '\0' && poprawny == 1)
            {   

                if(kom.mtext[i] >= '0' && kom.mtext[i] <= '9')
                {
                    liczba[j] = kom.mtext[i];
                    j++;
                    liczba_znak = 0;
                }   
                else if(kom.mtext[i] == '+' && liczba_znak == 0)
                {
                    strcpy(tabliczb[k],liczba);
                    while(j>=0)
                        liczba[j]='\0';
                    j++;
                    liczba_znak = 1;
                }
                else
                    poprawny = 0;

                i++;
            }
            if(poprawny)
                printf("Poprawny\n");
            else
                printf("Niepoprawny\n");
            printf("\nPodaj: ");
        }   
    }
    else
    {
        int len;

        while(kom.mtext[0] != '#') 
        {   
            i=0;
            usleep(500);
            printf("Podaj wyrazenie w postaci 'liczba1+liczba2+liczba3+..+liczban': ");
            fgets(kom.mtext, 255, stdin);
            kom.mtext[strcspn(kom.mtext, "\r\n")] = '\0'; // usuwanie znaku \r \n 
            len = strlen(kom.mtext);
            kom.mtype = pid2;
            msgsnd(ch, &kom, len+1, 0);
            printf("Wyslano: %s, do procesu: %d\n", kom.mtext, kom.mtype);
            fflush(stdin);
        }
        msgctl(ch, IPC_RMID, &buf);
    }
}

return 0;
 }

EDIT 编辑

SOLVED! 解决了! The problem was with strcpy(tabliczb[k],liczba); 问题出在strcpy(tabliczb[k],liczba); I dont know rly why :/ i change strcpy(tabliczb[k],liczba); 我不知道为什么:/我改变了strcpy(tabliczb[k],liczba); to straight writing into tabliczb[k] few lines above 将上面的几行直接写入tabliczb [k]

msgrcv(ch, &kom, 512, getpid(), 0) looks very suspect because kom is way less than 512 bytes long. msgrcv(ch, &kom, 512, getpid(), 0)看起来非常可疑,因为kom长度小于512字节。 Why not use sizeof kom instead? 为什么不使用sizeof kom呢?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM