- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一份大学作业。我的作业是使用 fork 制作项目,并使用流水线方法通过子进程和父进程传递数据。那么我们需要创建两个管道。第一个管道发送一个 txt 文件,您将在其中写入“Ps -A”的结果,第二个管道将返回 pids 及其优先级。教授说我们应该使用动态数组,并且我们应该通过一个结构将 pid 数组和 ppids 数组传回给 child。Child 在屏幕上打印这两个数组。我遇到的问题是 child 在这里填满了数组,但是当我将它们发送给父亲时,父亲并没有简单地从结构中读取数组,也没有在屏幕上打印任何内容:(你能帮我解决这个问题吗?
struct dyna {
int *pids;
int *ppids;
};
int main(int argc, char *argv[]){
int child_id;
int pipe_pc[2],pipe_cp[2];
int result_pc,result_cp;
int lines1,i;
if (argc!=2)//elegxos gia to an ta arguments pou edwse o xristis einai arxeio1 arxeio2 {
fprintf(stderr,"Lathos arithmos orismaton.To swsto einai %s filename.txtn",argv[0]);
exit(1);
} else {
result_pc=pipe(pipe_pc);
if (result_pc==-1) exit(-1);
result_cp=pipe(pipe_cp);
if (result_cp==-1) exit(-1);
struct dyna dyn;
child_id=fork();
if (child_id==-1) exit(-1);
//child
if (child_id==0){
char child_read_msg[buff];
close(pipe_pc[1]);
memset(child_read_msg,0,buff);
read(pipe_pc[0],child_read_msg, buff);
printf("nchild process:child read from father: %sn",child_read_msg);
char child_write_msg[buff]="lol",lines[buff]="lines.txt",* pch,**grammes;
FILE *pFile1,*pFile2;
long lSize1,lSize2;
char *buffer1,*command,*buffer2;
size_t file1str,file2str;
command = (char*)malloc(strlen("wc -l >")+strlen(child_read_msg)+strlen(lines));
sprintf(command,"ps -A> %s",child_read_msg);
system(command);
//vazoume ta periexomena tou processes.txt se enan buffer
pFile1 = fopen ( child_read_msg, "rb" );
fseek (pFile1, 0 , SEEK_END);
lSize1 = ftell (pFile1);
rewind (pFile1);
buffer1 = (char*) malloc (sizeof(char)*lSize1);
if (buffer1 == NULL) {fputs ("Memory error",stderr); }
file1str = fread (buffer1,1,lSize1,pFile1);
if (file1str != lSize1) {fputs ("Reading error",stderr); }
fclose(pFile1);
//vriskoume ton arithmon grammon tou arxeiou
sprintf(command,"wc -l %s>%s",child_read_msg,lines);
system(command);
pFile2 = fopen ( lines, "rb" );
fseek (pFile2, 0 , SEEK_END);
lSize2 = ftell (pFile2);
rewind (pFile2);
buffer2 = (char*) malloc (sizeof(char)*lSize1);
if (buffer2 == NULL) {fputs ("Memory error",stderr); }
file2str = fread (buffer2,1,lSize2,pFile2);
if (file2str != lSize2) {fputs ("Reading error",stderr); }
fclose(pFile2);
sscanf(buffer2,"%d",&lines1); //lines1= arithmos grammon tou processes.txt
sprintf(command,"rm -r %s",lines);
system(command);
free(buffer2);
i=0;
dyn.pids=(int *)calloc(sizeof(int),lines1); //desmeuei mnimi dinamika gia ton proto pinaka tis struct pou periexei ta pid
pch = strtok (buffer1,"n");
while (pch != NULL){
sscanf(pch,"%d",&dyn.pids[i]);
pch = strtok (NULL, "n");
i++;
}
dyn.ppids=(int *)calloc(sizeof(int),lines1);
for (i=1;i<lines1;i++) /*Gemizei ton pinaka kai vazei tis proteraiotites tis kathe diergasias */ {
dyn.ppids[i]=getpriority(PRIO_PROCESS,dyn.pids[i]);
}
//for (i=1;i<lines1;i++){
//printf("%dn",dyn.ppids[i]);
//}
close(pipe_cp[0]);
write(pipe_cp[1], &dyn,sizeof(dyn));
}
//parent
else {
close(pipe_pc[0]);
write(pipe_pc[1], argv[1],strlen(argv[1]));
printf("nparent process: father wrote to child: %sn",argv[1]);
wait(NULL);
close(pipe_cp[1]);//kleinoume to write-end, o pateras mono diabazei apo to pipe_cp
read(pipe_cp[0],&dyn,sizeof(dyn));//parent diabazei ayto poy exei grapsei to paidi
//prints the array with the priorities of the processes
for (i=1;i<lines1;i++){
printf("%dn",dyn.ppids[i]);
}
}
return 0;
}
}
最佳答案
write(pipe_cp[1], &dyn,sizeof(dyn))
只是传输结构中的两个指针,而不是它们引用的实际数据。这些指针持有的地址在父进程中是没有意义的,因为它有一个单独的地址空间。在那里取消引用它们会导致未定义的行为,很可能是段错误。
如果您希望您的代码以这种方式工作,您需要将结构的成员声明为固定大小的数组,而不是指针。通过这样做,结构本质上变成了一个容器,它本身包含两个数组。
关于c - 通过管道和 fork 传递具有 2 个动态数组的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5663086/
我正在尝试创建一个包含 int[][] 项的数组 即 int version0Indexes[][4] = { {1,2,3,4}, {5,6,7,8} }; int version1Indexes[
我有一个整数数组: private int array[]; 如果我还有一个名为 add 的方法,那么以下有什么区别: public void add(int value) { array[va
当您尝试在 JavaScript 中将一个数组添加到另一个数组时,它会将其转换为一个字符串。通常,当以另一种语言执行此操作时,列表会合并。 JavaScript [1, 2] + [3, 4] = "
根据我正在阅读的教程,如果您想创建一个包含 5 列和 3 行的表格来表示这样的数据... 45 4 34 99 56 3 23 99 43 2 1 1 0 43 67 ...它说你可以使用下
我通常使用 python 编写脚本/程序,但最近开始使用 JavaScript 进行编程,并且在使用数组时遇到了一些问题。 在 python 中,当我创建一个数组并使用 for x in y 时,我得
我有一个这样的数组: temp = [ 'data1', ['data1_a','data1_b'], ['data2_a','data2_b','data2_c'] ]; // 我想使用 toStr
rent_property (table name) id fullName propertyName 1 A House Name1 2 B
这个问题在这里已经有了答案: 关闭13年前。 Possible Duplicate: In C arrays why is this true? a[5] == 5[a] array[index] 和
使用 Excel 2013。经过多年的寻找和适应,我的第一篇文章。 我正在尝试将当前 App 用户(即“John Smith”)与他的电子邮件地址“jsmith@work.com”进行匹配。 使用两个
当仅在一个边距上操作时,apply 似乎不会重新组装 3D 数组。考虑: arr 1),但对我来说仍然很奇怪,如果一个函数返回一个具有尺寸的对象,那么它们基本上会被忽略。 最佳答案 这是一个不太理
我有一个包含 GPS 坐标的 MySQL 数据库。这是我检索坐标的部分 PHP 代码; $sql = "SELECT lat, lon FROM gps_data"; $stmt=$db->query
我需要找到一种方法来执行这个操作,我有一个形状数组 [批量大小, 150, 1] 代表 batch_size 整数序列,每个序列有 150 个元素长,但在每个序列中都有很多添加的零,以使所有序列具有相
我必须通过 url 中的 json 获取文本。 层次结构如下: 对象>数组>对象>数组>对象。 我想用这段代码获取文本。但是我收到错误 :org.json.JSONException: No valu
enter code here- (void)viewDidLoad { NSMutableArray *imageViewArray= [[NSMutableArray alloc] init];
知道如何对二维字符串数组执行修剪操作,例如使用 Java 流 API 进行 3x3 并将其收集回相同维度的 3x3 数组? 重点是避免使用显式的 for 循环。 当前的解决方案只是简单地执行一个 fo
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有来自 ASP.NET Web 服务的以下 XML 输出: 1710 1711 1712 1713
如果我有一个对象todo作为您状态的一部分,并且该对象包含数组列表,则列表内部有对象,在这些对象内部还有另一个数组listItems。如何更新数组 listItems 中 id 为“poi098”的对
我想将最大长度为 8 的 bool 数组打包成一个字节,通过网络发送它,然后将其解压回 bool 数组。已经在这里尝试了一些解决方案,但没有用。我正在使用单声道。 我制作了 BitArray,然后尝试
我们的数据库中有这个字段指示一周中的每一天的真/假标志,如下所示:'1111110' 我需要将此值转换为 boolean 数组。 为此,我编写了以下代码: char[] freqs = weekday
我是一名优秀的程序员,十分优秀!