首先,我肯定知道有更快,更少的矫枉过正的解决方案,但我绝对需要用子进程填充数组。
假设我有3个孩子:
int pos = 0;
for (i = 0; i<3 ; i++){
switch (fork()){
case -1: //fork error;
printf("[ERROR] - fork()\n");
exit(EXIT_FAILURE);
case 0: //child
fill(&req, pos);
pos++;
exit(EXIT_SUCCESS);
default:
break;
}
}
填充基本上是这样的:
void fill (request *req, int pos){
req->array[pos] = 1;
}
我意识到这种方法当然不起作用,因为每个孩子都有pos = 0的副本,并且他们只是递增他们的副本,所以数组总是被修改为0。 struct请求是一个simpe结构,带有一个pid和一个int数组,通过fifo发送。
typedef struct request {
int cpid; //client pid
int array[SIZE]; //array
} request;
如何仅使用子进程填充此数组?我必须重复,我不能使用变通办法,只是fork()和childs。 谢谢!
答案 0 :(得分:1)
如果孩子是必须填充阵列的孩子,那么父母或任何其他孩子都看不到他们的修改,除非父母和孩子共享一些记忆(shmget
)。
其他解决方法包括使用管道或任何其他通信机制将所有数据发送到中央进程。
答案 1 :(得分:0)
您无法在fork
之后更改某些数据(要共享),因为每个process都有-by definition-其拥有 address space,因此对数据的更改对该进程是私有的(除非您使用共享内存)。
您可以使用shared memory,您必须在调用fork(2)之前设置该shm_overview(7)。然后你有同步问题。请阅读sem_overview(7)和threads;在你的情况下,我觉得它有点矫枉过正。
您也可以使用mutexes,而不是进程。有些进程有多个线程,所有线程都共享 - 通过定义 - 相同的公共地址空间。同样,同步是一个问题(例如pthread tutorial)。阅读一些IPC
您可以使用其他一些pipe(7),例如poll(2) - 秒。您可能需要像event loops这样的多路复用系统调用。
(我想,也许是错误的,这个功课的重点是教你管道和textual protocol;如果你使用管道,最好采用一些Advanced Linux Programming)
阅读perror(3)。
顺便说一句,在fork
和其他系统调用错误上,您通常应该像printf
那样调用{{3}} - 不是普通的exit(EXIT_FAILURE)
。