- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个程序,其中父进程将 fork n 个子进程(子进程的节点数),并且子进程必须执行每个子进程都相同的特定任务。
在我的代码中放置几个 printf 后,我意识到子进程中的 for 循环存在一个错误,即 for 没有在正确的位置终止,例如,如果代码读取 for(p=0;p<=10; p++)
printf 显示该进程的计数不超过 p=6!
我对此真的很陌生,尽管我搜索了网络,但没有找到任何有用的东西!有人可以帮我吗?
#include "ranlib.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define node_number 1
#define seed1 123455L
#define seed2 54321L
#define floor_rates {{0,1,1},{1,0,1}}
// the floor_rates should be intialized at the beginning and they specify the amount
// of flow rate to a specific destination from a specific node, for example
// floor_rates[k][i] is the amount of data node i has for destination k.
#define numofflows 2
float **diagonalcreation(int matsize, float *matrix)//, float **diagonal)
{
int i;
int j;
int k;
float **diagonal;
diagonal=malloc(sizeof(float *)*matsize);
for(i=0;i<matsize;i++)
{
diagonal[i]=malloc((sizeof(float))*matsize);
}
for(i=0; i<matsize;i++)
{
for(j=0;j<matsize; j++)
{
if(i==j)
{
diagonal[i][j]=matrix[i];
}
else
{
diagonal[i][j]=0;
}
}
}
for( k=0;k<matsize; k++)
{
printf("behnaz hastam\n");
for(j=0; j<matsize; j++)
{
printf("%f\t",diagonal[k][j]);
}
}
return diagonal;
}
int main()
{
float c_mean[node_number][node_number];
pid_t pid[node_number];
int check;
check=0;
// int index;
// index=0;
float c_var[node_number][node_number];
struct nodes{
float *a;
float *b;
float *r;
int length_r;
float *s;
int length_s;
float **A;
float **B;
//right now we have not implemented the DIV protocol but when we do there is a need for a different variable named seq_number_rec which is the last sequence number recieved.
//last_seq_number_sent;
//ack
float **lambdaprimey_x_x;
float **lambdax_y_x;
float lambdax_x_x[numofflows];
float **t;
float **ttemp;
float **tprime;
float **lambdacomputeprime;
float lambdacompute[numofflows];
int *neighbors;
int length_neighbors;
} node[node_number];
int i;
int j;
//int numofflows;
/* srand((unsigned)time(0));
seed1=random();//12345L;
seed2=random();//54321L;*/
setall(seed1,seed2);
//signal(SIGCHLD, SIG_IGN);
for(i=0;i<=node_number-1;i++)
{
for(j=0; j<=i-1; j++)
{
c_mean[i][j]=genchi(1.0);
if (c_mean[i][j]>1)
{
c_mean[i][j]=1.0/c_mean[i][j];
}
if(i==j)
{
c_mean[i][j]=0;
}
}
}
for(i=0;i<=node_number-1;i++)
{
for(j=i; j<=node_number-1; j++)
{
c_mean[i][j]=c_mean[j][i];
}
}
//we are assuming that the links are bimodal with a certain probability to be up or down.
for(i=0;i<=node_number-1;i++)
{
for(j=0;j<=node_number-1; j++)
{
c_var[i][j]=c_mean[i][j]*(1-c_mean[i][j]);
}
}
// pid[0]=fork();
for(i=0;i<node_number;i++)
{
pid[i]=fork();
if(pid[i]==0)
{
int *temp_n=node[i].neighbors;
float *temp_a=node[i].a;
float *temp_b=node[i].b;
float *temp_r=node[i].r;
float *temp_s=node[i].s;
//pid[i]=fork();
int p;
//The first step is to do the initialization in each process.
for(p=0; p<=10; p++)
{
if(i==0){
printf("%d %d %d\n\n\n",p,i, node_number);}
node[i].length_neighbors=0;
if(c_mean[i][p]!=0)
{
*temp_n=p;
temp_n++;
node[i].length_neighbors++;
*temp_a=c_var[i][p];
temp_a++;
*temp_b=c_var[p][p];
temp_b++;
*temp_r=c_mean[i][p];
temp_r++;
*temp_s=c_mean[p][i];
temp_s++;
free(&temp_n);
free(&temp_a);
free(&temp_b);
free(&temp_s);
free(&temp_r);
}
}
node[i].A=diagonalcreation(node[i].length_neighbors,node[i].a);//, float **diagonal)
/* for( k=0;k<node[i].neighbors; k++)
{
printf("\n");
for(j=0; j<node[i].neighbors; j++)
{
printf("%f\t",node[i].A[k][j]);
}
}
*/
free(node[i].A);
printf("behnaaaz");
exit(0);
}
else if(pid[i]<0)
{
printf("error_pid");
break;
}
}
for(i=0;i<node_number;i++)
{
if(pid[i]!=0)
{
check++;
}
}
if(check==node_number)
{
for(i=0;i<node_number;i++)
{
wait(NULL);
printf("waitover");
}
}
return(0);
}
最佳答案
首先,对于错误检查,不要使用 printf()
...而是使用 fprintf
,并输出到 stderr
,因为不缓冲,而 stdout
和 printf
确实缓冲输出,因此将这些函数与 stdout
一起使用不一定会打印到控制台由于缓冲而在调用点发生。
其次,在 for
循环中,您将内存释放给指针,但该内存似乎并未通过 malloc()
分配。这将导致未定义的行为,因为您只能在调用 malloc()
返回的同一指针上调用 free()
...您无法释放-up 数组的“部分”...您只能在完成后立即释放整个分配的内存块。
第三,您将向 free()
传递一个指向已在堆栈上分配的值的指针(即 temp_n
等)。因此,您实际上将一个指向堆栈上地址的指针传递给 free()
,该指针指向堆上的地址,而不是指向从返回的堆上内存地址的指针值。 malloc()
。但无论哪种方式,您仍然无法释放数组的一部分,而这正是您正在尝试做的事情。
关于c - 试图找出为什么子进程比应有的时间更早终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6667082/
我是 C++ 的新手,我在使用这段代码时遇到了问题: string output_date(int day, int month, int year){ string date; if
所以我这样做了 tar cvzf test.zip FP 为了创建目录 FP 的 zip 但是,它会列出 zip 中的目录 FP/ FP/php/ FP/php/pdf/ FP/php/docs/ F
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我的测试用例是这样的: class FooTest extends PHPUnit_Framework_TestCase { /** @covers MyClass::bar */ f
我正在尝试将brew install wine作为使electron-builder工作的一步。但是我所能得到的只是以下响应: ==> Installing dependencies for wine
我这样做: string[,] string1 = {{"one", "0"},{"Two", "5"},{"Three","1"}}; int b = 0; for(int i = 0; i <=
我正在尝试使用 SetWindowsHookEx 键盘 Hook Notepad.exe。 如您所见,工作线程正在将其 ASCII 代码(即 wParam)发送到指定的服务器。 UINT WINAPI
我正在尝试将 ListView 实现到我的 Fragment 中,但无论我尝试什么,我都会得到一个 NullPointerException。我检查对象是否为 null 并记录是否为 null,看起来
我尝试在一行中对齐两个 div。使用 float left 属性,一切顺利。但是当我在 div 中使用图像时,它开始产生问题。 所以这是我的示例代码:- Some headi
我目前正在使用此代码来获取图像的灰度图像表示并以 (512, 370, 1) 的格式表示它大批。 img_instance = cv2.imread(df.iloc[i][x_col]) / 255.
总结 我正在创建一个简单的应用程序,它允许用户选择一个包含顶级窗口的进程。用户首先键入 native DLL(而非托管 DLL)的路径。然后用户键入将在 Hook 过程中调用的方法的名称。该方法不得返
我是一名优秀的程序员,十分优秀!