我一直在努力弄清楚如何构建一个数组,以便每个单元都按照创建的顺序拥有子进程的 PID。示例输出:
PID: 19581, Parent PID: 19579
Data[0]: 19581
Data[1]: 1
Data[2]: 2
Data[3]: 3
Data[4]: 4
Data[5]: 5
Data[6]: 6
Data[7]: 7
Data[8]: 8
Data[9]: 9
PID: 19582, Parent PID: 19579
Data[0]: 0
Data[1]: 19582
Data[2]: 2
Data[3]: 3
Data[4]: 4
Data[5]: 5
Data[6]: 6
Data[7]: 7
Data[8]: 8
Data[9]: 9
PID: 19583, Parent PID: 19579
Data[0]: 0
Data[1]: 1
Data[2]: 19583
Data[3]: 3
Data[4]: 4
Data[5]: 5
Data[6]: 6
Data[7]: 7
Data[8]: 8
Data[9]: 9
PID: 19584, Parent PID: 19579
Data[0]: 0
Data[1]: 1
Data[2]: 2
Data[3]: 19584
Data[4]: 4
Data[5]: 5
Data[6]: 6
Data[7]: 7
Data[8]: 8
Data[9]: 9
PID: 19579, Parent PID: 10296
Data[0]: 0
Data[1]: 1
Data[2]: 2
Data[3]: 3
Data[4]: 4
Data[5]: 5
Data[6]: 6
Data[7]: 7
Data[8]: 8
Data[9]: 9
等等。对我来说这可能是代码中最难的部分。我能到达的最远的地方就是我下面的东西。任何有关下一步做什么的指导都会非常有帮助。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
pid_t childpid;
pid_t mypid;
int numberOfProcess, i;
mypid = getpid();
if(argc != 2){
fprintf(stderr, "Usage: %s processes\n", argv[0]);
return 1;
}
//Determine the number of child process.
numberOfProcess = atoi(argv[1]);//Look up atoi(int)
int data[numberOfProcess]; //Data array
for(i = 0; i < numberOfProcess; i++){
childpid = fork();
if (childpid <= 0)
break;
}
if (childpid != 0){
for (i=1; i < numberOfProcess; i++)
wait(NULL);
}
fprintf(stderr,"\nPID: %ld, Parent PID: %ld\n", (long)getpid(),(long)getppid());
for (i=0; i < numberOfProcess; i++){
int j;
data[j]= j;
printf ("Data[%i]: %i\n",i,data[j++]);
}
return 0;
}
最佳答案
当父进程 fork()
时,子进程获得其父进程 pid 数组的精确副本。
您在父进程循环中需要的是,在 fork() 之后,只有子进程应该使用其 pid 设置其正确的数组槽,而父进程只等待其子进程在继续循环之前退出。
代码如下所示:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char **argv)
{
pid_t childpid;
int number_of_processes, i;
int data[number_of_processes];
number_of_processes = atoi(argv[1]);
for (i = 0; i < number_of_processes; ++i)
data[i] = i;
for (i = 0; i < number_of_processes; ++i) {
childpid = fork();
/* fork() failure */
if (childpid < 0) {
perror("fork");
exit(1);
}
/* Child's code */
if (childpid == 0) {
data[i] = (int) getpid();
fprintf(stderr, "\nmy pid = %d\tmy parent's pid = %d\n",
(int) getpid(), (int) getppid());
for (i = 0; i < number_of_processes; ++i)
fprintf(stderr, "\n\tdata[%d] == %d", i, data[i]);
fprintf(stderr, "\n\n");
exit(1);
}
/* Parent's code */
else
wait(NULL);
}
fprintf(stderr, "\nmy pid = %d\tmy parent's pid = %d\n",
(int) getpid(), (int) getppid());
for (i = 0; i < number_of_processes; ++i)
fprintf(stderr, "\n\tdata[%d] == %d", i, data[i]);
fprintf(stderr, "\n\n");
return 0;
}
关于c - 如何将一个元素插入到已经占用的数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24398978/