为什么在C分叉的情况下,即使有防护措施,我的文件也执行两次此标头?

Dan*_*ler 0 c fork header include-guards execvp

即使有警卫人员到位,我的文件仍在尝试两次执行mkdir。

我尝试将ifndef放在另一个c文件中,但仍执行两次

酸碱度

#ifndef P_H
#define P_H

void p1(char* filepath, int m);


#endif
Run Code Online (Sandbox Code Playgroud)

main.c

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

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

    p1("Hi",2);

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

第1版

#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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行gcc -o p1test main.c p1.c和./p1test时,出现以下错误:mkdir:无法创建目录“ MyNewDirectory”:文件存在。”显然,它正在建立目录,但随后尝试使难道不是应该防止这些多次执行的防护措施吗?这与派生有关系吗?这是第一次尝试使用自定义头文件。在此先感谢,如果已经在某些地方回答过,请让我知道,我将删除它。

jmq*_*jmq 5

您两次调用fork(),因此有4个不同的进程在运行。两个孩子都试图创建目录。您只需要调用一次fork():

cpid = fork();
if (cpid == -1) {
    perror("fork failed");
}
Run Code Online (Sandbox Code Playgroud)

标头保护罩是正确的,与您的问题无关。它们仅在编译时使用,以确保您的头文件仅包含一次。