该程序使用C语言编写,并由PuTTy会话中的服务器使用GCC编译。该程序也由同一台服务器运行。
我发送带有2个参数的函数调用。 " a",一个二维整数数组,包含11列和不同数量的行和" clients",一个整数,指定数组中存在多少行。 (服务器询问用户将服务多少客户端并创建" a"作为具有多行的数组。理想情况下,这些函数调用适用于任意数量的客户端。)
在此函数调用中,将检查每个客户端保存当前状态的列。如果任何客户端处于状态(由整数表示)0,1,2,3或4,则该函数返回1.否则,该函数返回0.此函数如下所示。
int incomplete(int a[][11], int clients) {
for (i = 0; i < clients; i++) {
if (a[i][1] == 0 || a[i][1] == 1 || a[i][1] == 2 || a[i][1] == 3 || a[i][1] == 4) {
return 1;
}
}
return 0;
}
进行调用的函数是while循环继续循环的条件。如果发现任何客户端处于状态0,1,2,3或4,则while循环应继续执行。
while (incomplete(a, clients) == 1) {
...
}
然而,在返回一个值时,程序会立即崩溃,并出现&#34; Segmentation Fault(core dumped)&#34;错误。现在我已经完成了研究,并且由于内存泄漏,访问超出范围的内存位置,堆栈问题等而经常发生分段错误。
问题是,当函数调用如此简单和干燥时,我不知道我是如何得到分段错误的。发送一个包含33个整数的数组(没有什么大的,只有3个客户端的11列信息),一个表示行数的整数,然后返回一个整数进行比较。
有趣的是,具有相似参数的类似功能完全正常。它没有回报价值。
void printArray(int a[][11], int clients) {
printf("\n\n+-------+----+----+----+----+----+----+----+----+----+----+");
for (i = 0; i < clients; i++) {
printf("\n| %5d | %2d | %2d | %2d | %2d | %2d | %2d | %2d | %2d | %2d | %2d |",
a[i][0], a[i][1], a[i][2], a[i][3],
a[i][4], a[i][5], a[i][6], a[i][7],
a[i][8], a[i][9], a[i][10]);
}
printf("\n+-------+----+----+----+----+----+----+----+----+----+----+\n\n");
}
该方法称为...
printArray(a, clients);
我可以通过在incomplete()函数中返回任何整数值来重现该问题。我还可以说通过放置伪printf语句来跟踪代码的执行,然后在它尝试返回值时可预测地崩溃,从而完成了对incomplete()函数的处理。
这里发生了什么?我的代码的pastebin可以在这里找到: serverTest5.c --- http://pastebin.com/dHfVmKki listQueue3.h --- http://pastebin.com/gvpHFsdF
阵列&#39; a&#39;使用以下代码定义和填充...
// Create Multidimensional Array for Processes
int a[clients][11];
// Create CommonFIFO
printf("\nSERVER: Making CommonFIFO...");
if ((mkfifo("CommonFIFO",0666)<0 && errno != EEXIST)) {
perror("\nERROR: Can't create CommonFIFO.");
exit(-1);
}
// Open CommonFIFO, reading
printf("\nSERVER: Opening CommonFIFO to read...");
if ((fda=open("CommonFIFO", O_RDONLY))<0)
printf("\nERROR: Can't open CommonFIFO to read.");
// For each Client
for (i = 0; i < clients; i++) {
// Read clientID, arrival time, and 5 bursts from CommonFIFO
printf("\nSERVER: Servicing Client %d.\nSERVER: Reading CommonFIFO...", i+1);
finish = read(fda, &input, sizeof input);
printf("\nSERVER: Received job.");
// Enter the data into the array
a[i][0] = input.clientID;
a[i][1] = 0;
a[i][2] = input.timeArrival;
a[i][3] = input.burst1;
a[i][4] = input.burst2;
a[i][5] = input.burst3;
a[i][6] = input.burst4;
a[i][7] = input.burst5;
a[i][8] = 0;
a[i][9] = 0;
a[i][10] = 0;
}