c - 为什么我的文件执行此 header 两次,即使在 C 中 fork 时有保护措施?

标签 c header fork execvp include-guards

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

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

p.h

#ifndef P_H
#define P_H

void p1(char* filepath, int m);


#endif

主.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: cannot create directory 'MyNewDirectory': File exists”。显然它正在创建目录,但随后又试图重新创建它。守卫不应该防止这些多次执行吗?这与 fork ?这是第一次尝试使用自定义头文件。提前致谢,如果这已经在某个地方得到回答,请告诉我,我将删除它。

最佳答案

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

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

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

关于c - 为什么我的文件执行此 header 两次,即使在 C 中 fork 时有保护措施?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58382060/

相关文章:

objective-c - 重新分配父 PID

java - 我想计算代码将进行的迭代总数

c - 传递一个 "normal"二维数组作为 **

C++ 类规范,实现问题

linux - 调用 fork() 时哪个进程先运行

c - 使用 SysV 信号量时不一致

c - pthread_kill 异步信号在 Linux 上安全吗?

c - 在 Windows 和 Linux 上的 CMake 文件中链接数学库

ios - 仅在固定标题时自定义节标题,否则不固定(SwiftUI)

php - 我的 header() 调用没有重定向到新页面