c - 如何将一个元素插入到已经占用的数组中?

标签 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;

}

最佳答案

当父进程 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/

相关文章:

C计算字符串中某个字符出现的次数

c - _filelength 和 chsize 的问题

c++ - fflush - 如何检查最后一个操作是否为输出操作

c - 删除数据文件中的字符串

c - 使用属性对齐时的内存对齐(1)

C - fgets() - 如果字符串更长怎么办?

c - Fork() 工作不正确,返回 3 次

c - GCC 内联汇编作为二进制数组

c++ - 如何在运行时制作 mex 函数 printf?

c - 如何在C中返回指向字符串数组的指针