Почему мой файл выполняет этот заголовок дважды, даже с защитой на месте при разветвлении в C? - PullRequest
0 голосов
/ 14 октября 2019

Даже с установленной защитой мой файл все еще пытается выполнить mkdir дважды.

Я попытался поместить ifndef в другой файл c, но он все еще выполняется дважды

ph

#ifndef P_H
#define P_H

void p1(char* filepath, int m);


#endif

main.c

#include "main.h"// includes ifndef with p1.h inside it

int main(int argc, char *argv[]){

    p1("Hi",2);

    return 0;

}

p1.c

#include "phase1.h"
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>

void p1(char* filepath, int m){
    pid_t cpid;
    cpid = fork();
    if ((cpid = fork()) == -1) {
        perror("fork failed");
    }
    if(cpid > 0){
        wait(NULL);
    }
    else{
        char *makeDir[] = {"mkdir", "MyNewDirectory", NULL};
        execvp(makeDir[0],makeDir);
    }
}

когда я выполняю gcc -o p1test main.c p1.c и ./p1test, Iполучить сообщение об ошибке, что mkdir: не может создать каталог 'MyNewDirectory': файл существует ". Очевидно, он работает, чтобы создать каталог, но затем пытается создать его снова. Разве охранники не должны защищать от этих нескольких выполнений? что-то делать с вилкой? Это первая попытка использовать пользовательские файлы заголовков. Заранее спасибо, и если где-то уже есть ответ, пожалуйста, дайте мне знать, и я удалю это.

1 Ответ

5 голосов
/ 14 октября 2019

Вы дважды вызываете fork (), чтобы запустить 4 разных процесса. Двое детей пытаются создать каталог. Вам нужно вызывать fork () только один раз:

cpid = fork();
if (cpid == -1) {
    perror("fork failed");
}

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

...