-1

我的问题是股票没有改变我认为 if 语句 pid[i] == 0 有问题。我只从孩子的代码的“父进程部分”得到打印。

#include <stdio.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <sys/types.h>

#define NUM_CHILDS 3
#define LOOPS 6
#define FILLING_UP 20
#define SHMSEGSIZE sizeof(int)

int main() {
        int shmID1, shmID2, *stock, *flag, loop_i, pid[NUM_CHILDS], i;
        loop_i = 1;
        shmID1 = shmget(IPC_PRIVATE, SHMSEGSIZE, IPC_CREAT | 0644);
        shmID2 = shmget(IPC_PRIVATE, SHMSEGSIZE, IPC_CREAT | 0644);
        stock = (int *) shmat(shmID1, 0, 0);
        flag = (int *) shmat(shmID2, 0, 0);
        *stock = 20;
        *flag = 1;

        for (i = 0; i < NUM_CHILDS; i++) {
                pid[i] = fork();
                if(pid[i] == -1) {
                        printf("error by crating a child!\n\n");
                        return -1;
                }
                if (pid[i] == 0) {
                        printf("Child %d: %d", i, pid[i]);

                        while(*flag==1) {
                                if(*stock>0) {
                                        *stock--;
                                        usleep(100000);
                                }
                        }
                        shmdt(flag);
                        shmdt(stock);
                        return 0;

                }
                else {
                        while(loop_i <= LOOPS) {
                                usleep(100000);
                                printf("Actual stock: %d\n", *stock);
                                if(*stock<=0) {
                                        *stock += FILLING_UP;
                                        loop_i++;
                                        printf("Stock is filled up");
                                }
                        }
                        *flag = 0;
                }
        }

        for (i = 0; i < NUM_CHILDS; i++) {
                waitpid(pid[i], NULL, 0);
        }
        printf("Programm ends", LOOPS, *stock);
        shmdt(flag);
        shmdt(stock);
        shmctl(shmID1, IPC_RMID, 0);
        shmctl(shmID2, IPC_RMID, 0);
        return 0;
}
4

2 回答 2

2

Linux 中的 fork() 用于创建新进程。同样在fork之后,它在子进程中返回0,在父进程中返回子进程的pid。所以在父进程中pid!= 0。因此 if(pid==0) 中的语句不会在父进程中执行。

于 2013-05-24T03:35:05.317 回答
2

您应该重置loop_i为 1。否则父级中的 while 循环将为LOOPS第一个子级运行时间,而其他子级运行时间为 0 次。

loop_i = 1;
while(loop_i <= LOOPS) {
    ...
}
于 2013-05-24T01:03:33.287 回答