为啥我的文件执行此标头两次,即使在 C 中分叉时有防护措施?

Posted

技术标签:

【中文标题】为啥我的文件执行此标头两次,即使在 C 中分叉时有防护措施?【英文标题】:Why is my file executing this header twice even with guards in place while forking in C?为什么我的文件执行此标头两次,即使在 C 中分叉时有防护措施? 【发布时间】:2019-10-14 18:12:38 【问题描述】:

即使有保护,我的文件仍然尝试执行 mkdir 两次。

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

p.h

#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 时,我得到的错误是 mkdir:无法创建目录'MyNewDirectory':文件存在“。显然它正在创建目录,但随后又试图再次创建。守卫不应该防止这些多次执行吗?这是否与叉子?这是第一次尝试使用自定义头文件。提前致谢,如果已经在某个地方回答了这个问题,请告诉我,我将删除它。

【问题讨论】:

在运行程序之前确保目录不存在,然后再次运行。 @Daniel Kunkler 你能显示 main.h 的内容吗? 【参考方案1】:

你调用 fork() 两次,所以你有 4 个不同的进程在运行。这两个孩子都在尝试创建目录。你只需要调用一次 fork():

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

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

【讨论】:

以上是关于为啥我的文件执行此标头两次,即使在 C 中分叉时有防护措施?的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 7 中,为啥即使只订阅一次 HttpClient.post 也会执行两次?

即使在获取数据后,React Component的render方法也会被调用两次

此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?

错误 C3861:即使在标头中有函数也找不到“解密”

为啥 fork 炸弹没有使 android 崩溃?

为啥分叉我的进程会导致文件被无限读取