如何将元素插入已经占据的数组中?

时间:2014-06-25 01:48:56

标签: c

我一直在努力弄清楚如何构建一个数组,以便每个单元格按照创建的顺序具有子进程的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;

}

2 个答案:

答案 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;
 }