为什么我的文件在 C 分叉时即使有防护装置,也会执行此标头两次?



即使有警卫,我的文件仍然试图执行两次 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:无法创建目录"我的新目录":文件存在"。显然,它正在努力制作目录,但随后尝试再次制作目录。难道警卫不应该防止这些多次处决吗?这与叉子有关吗?这是第一次尝试使用自定义头文件。提前感谢,如果这已经在某处得到回答,请告诉我,我会删除它。

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

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

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

最新更新