为什么我的文件在 C 中分叉时即使有守卫也执行两次这个头文件?

丹尼尔·库克勒

即使有警卫,我的文件仍然试图执行 mkdir 两次。

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

酸碱度

#ifndef P_H
#define P_H

void p1(char* filepath, int m);


#endif

主文件

#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: cannot create directory 'MyNewDirectory': File exists"。显然它正在创建目录,但随后尝试创建再说一遍。守卫不应该防止这些多次执行吗?这与分叉有关吗?这是第一次尝试使用自定义头文件。提前致谢,如果已经在某处回答了这个问题,请让我知道,我会删除它。

JMQ

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在with中分叉时,Python文件写入两次

C ++为什么我的代码不打印对给定文件的更新

为什么我的txt文件无法在C ++中打开?

当我们在C ++中声明头文件时,为什么不将空格视为空白?

为什么我的由 boost.python 和 c++ 头文件编译的 .so 文件失败了?

为什么多个头文件和源文件中的 C++ 继承不起作用?

为什么我的C#项目文件没有针对源文件的Compile Inlcude元素

C:我们为什么要包含声明但未定义的头文件?

为什么我们需要在C ++头文件中使用“ #if defined Identifier”?

为什么CodeBlocks编译器无法识别我在C的头文件中声明的函数?

为什么C ++需要单独的头文件?

为什么使用 C# 创建 *.gz 文件后我会得到损坏的 *.gz 文件?

即使文件在桥中,为什么我也无法访问objective-c 方法?

React w Gatsby:为什么有时我的字体文件被下载了两次

为什么我编译的 C++ 二进制文件不能执行?

为什么在我的 .c 文件中尝试使用头文件中的结构时会出现类型错误?

为什么python会读取我的文件两次?

为什么 C++ 标准将容器类拆分为多个头文件?

C#为什么我不能访问C:\ Users下的域用户的本地文件夹?

为什么(虽然.. getchar())在C中没有写入我的文件?

为什么我的文件没有用 ifstream C++ 打开?

“没有这样的文件或目录”如果我的文件位于正确的位置,为什么我的 c 构建文件无法构建我的 exe?

C#项目文件-为什么它不代表我的项目中的内容?

为什么我的 powershell 脚本无法在 C:\Program Files 中创建文件夹?

为什么我的C ++磁盘写测试比使用bash进行简单文件复制要慢得多?

我创建的支持主程序的C文件为什么不继承main的定义?

为什么我不能用C语言重写.txt文件?

为什么我的程序从 C++ 中的文件中读取额外的条目?

为什么我无法从Python调用的C扩展名中打开/读取txt文件?