我做了某种项目。程序需要创建3个进程。 第一个是从用户获取一个字符串,模型是:'number1 + number2 + .. + numbern'。之后,它将字符串发送到第二个进程。 第二个进程是检查用户是否发送有效(带模型)字符串并将其发送到第三个进程(如果它是okey) 第3个过程将“数字”相加并将其打印在屏幕上。
我已经完成了第一个工作的全部工作,并试图做第二个工作与第一个工作良好。
可悲的是,第二个进程在printf("Zaczynam sprawdzanie poprawnosci wyrazenia: %s\n", kom.mtext);
#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;
}
修改
解决了!问题出在strcpy(tabliczb[k],liczba);
我不知道为什么:/我改变strcpy(tabliczb[k],liczba);
直接写入tabliczb [k]上面的几行
答案 0 :(得分:0)
msgrcv(ch, &kom, 512, getpid(), 0)
看起来很可疑,因为kom
长度小于512字节。为什么不使用sizeof kom
?