C: сохранить PID в глобальной переменной - PullRequest
0 голосов
/ 11 ноября 2018

В настоящее время я работаю над школьным проектом и хочу сохранить PID своего процесса в глобальном идентификаторе массива, чтобы я мог использовать его в другой функции:

int id[3];

int main(int agrc,const char* agrv[]) {
for(int i = 0; i < 3; i++) {
    if((fork() == 0)) {
        id[i] = (int)getpid();
        printf("ID[%d] = %d\n",i,id[i]);
        if(i != 3) {
            printf("I am a wharehouse. PID = [%d] PPID = [%d]\n",getpid(),getppid());
            whcode();
            exit(0);
        }
        else if(i == 3) {
            printf("I am the central. PID = [%d] PPID = [%d]\n",getpid(),getppid());
            central_code();
            exit(0);
        }
    }
}
sleep(2);

printf("ID[0] = %d\n",id[0]);
printf("ID[1] = %d\n",id[1]);
printf("ID[2] = %d\n",id[2]);

}

Но когда я запускаю это, выходные данные последних 3 отпечатков равны 0, где это должен быть PID каждого процесса. Почему это происходит?

1 Ответ

0 голосов
/ 11 ноября 2018

При вызове fork() создается новый процесс с отдельным пространством виртуальной памяти. Этот дочерний процесс вернется из вызова к fork с 0, поэтому в вашем коде этот дочерний процесс перейдет внутрь ветви if и присвоит id[i] его pid. Но это назначение происходит в отдельном процессе, с отдельной виртуальной памятью, поэтому оно не влияет на пространство виртуальной памяти родителей, и родитель не увидит никаких изменений в своем массиве. Вот почему ваш код печатает нули.

Если вы хотите напечатать pids дочерних элементов родителем, используйте возвращаемое значение fork (), которое в parent является pid дочернего процесса. Внутри for используйте такой код:

pid_t child_id;
switch (child_id = fork()) {
    case -1:
        //Fork failed, exit with error or something
        break;
    case 0:
        //Child code
        printf("ID[%d] = %d\n",i,id[i]);
        if(i != 3) {
            printf("I am a wharehouse. PID = [%d] PPID = [%d]\n",getpid(),getppid());
            whcode();
            exit(0);
        }
        else if(i == 3) {
            printf("I am the central. PID = [%d] PPID = [%d]\n",getpid(),getppid());
            central_code();
            exit(0);
        }
        break;
    default:
       id[i] = child_id;
       break;
}

Кстати, вы действительно должны объявить массив id как pid_t id[3], а при печати распечатывать его долго. На данный момент это, вероятно, самый портативный способ справиться с этими вещами.

...