我正在上一堂课,学习如何在大学上学习Linux上的多程序编程。 我仍然非常环保并且尽力学习,所以你可能会看到任何错误的东西都会受到欢迎。
我有一个问题,要求我迭代一个数组,一半在主进程上, 另一半是关于孩子的过程。 我编写的代码就是这样做的,但问题是,我注意到如果我运行了几次二进制文件,主要(父)进程有时会出现分段错误。
请查看代码,告诉我它有什么问题,或者我是否错过了此类编程的关键方面。 我的答案在评论//答案从这里开始后开始。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#define ARRAY_SIZE 1000
int main()
{
int numbers[ARRAY_SIZE]; /* array to lookup */
int n; /* the number to find */
time_t t; /* needed to initialize random number generator (RNG) */
int i;
/* intializes RNG (srand():stdlib.h; time(): time.h) */
srand((unsigned)time(&t));
/* initialize array with random numbers (rand(): stdlib.h) */
for (i = 0; i < ARRAY_SIZE; i++)
numbers[i] = rand() % 10000;
/* initialize n */
n = rand() % 10000;
//answer starts here
int half = n / 2;
int count = 0;
int pid_status = 0;
pid_t pid_f = fork();
if (pid_f == -1)
{
return EXIT_FAILURE;
}
else
{
if (pid_f == 0) // child process iterates half end of the array
{
for (i = half; i < ARRAY_SIZE; ++i)
{
if (numbers[i] == n)
{
count++;
}
}
printf("Sons counter:%d\n", count);
exit(count);
} //else it's the father process
else
{
for (i = 0; i < half; ++i)
{
if (numbers[i] == n)
{
count++;
}
}
waitpid(pid_f, &pid_status, 0);
printf("Father counter:%d\n", count);
if (WIFEXITED(pid_status))
{
count += WEXITSTATUS(pid_status);
}
printf("Sum is=%d\n", count);
}
}
return 0;
}
答案 0 :(得分:5)
分段错误是由n有时超出范围引起的:
n = rand() % 10000;
//answer starts here
int half = n / 2;
一半可以是5000,但数字只有1000个元素。
也许你的意思是:
n = rand() % 1000;
答案 1 :(得分:1)
以下是您的代码的固定版本。初始化ARRAY_SIZE的一半到一半,而不是n。
正如您在代码中所说:import { DatePipe } from '@angular/common';
@NgModule({
providers: [
DatePipe
]
})
int n; /* the number to find */