我一直在努力弄清楚如何构建一个数组,以便每个单元格按照创建的顺序具有子进程的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;
}
答案 0 :(得分:-1)
当父进程fork()
时,子进程获得其父进程的pids数组的精确副本。
在父进程的循环中你需要的是在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;
}
答案 1 :(得分:-1)
你的问题不清楚。但是,我相信您正在尝试构建一个数组,以便每个单元格按照创建顺序具有pid
子进程。 击>
代码中的问题是 Linux
对分叉进程使用写入时复制,这意味着数组将被复制到子地址空格和然后该值将被替换。为 n个孩子留下 n个复制数组,每个仅一个单元格被更改。你不应该使用孩子将pid
写入数组。父进程应该处理它。
修改:我现在更新了我的问题代码。
看一下下面的例子:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i, numberOfProcess;
pid_t mypid, childpid;
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
// Initial values for the array before being copied
// to the child address space.
for(i = 0; i < numberOfProcess; i++){ data[i] = i; }
for(i = 0; i < numberOfProcess; i++){
childpid = fork();
// If child, learn the process ID and assign it. Then break the loop.
if (childpid <= 0) { data[i] = getpid(); break; }
}
if (childpid != 0){
for (i=1; i < numberOfProcess; i++) { wait(NULL); }
}
else {
fprintf(stderr,"\nPID: %ld, Parent PID: %ld\n", (long)getpid(),(long)getppid());
for (i=0; i < numberOfProcess; i++){ printf ("Data[%i]: %i\n",i,data[j++]); }
}
return 0;
}