为什么我的文件执行此 header 两次,即使在 C 中分叉时有守卫?
Why is my file executing this header twice even with guards in place while forking in C?
即使有保护措施,我的文件仍会尝试执行两次 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: cannot create directory 'MyNewDirectory': File exists”。显然它正在创建目录,但随后又试图重新创建它。守卫不应该防止这些多次执行吗?这与叉子?这是第一次尝试使用自定义 header 文件。在此先感谢,如果这已经在某个地方得到回答,请告诉我,我将删除它。
您调用了 fork() 两次,因此您有 4 个不同的进程 运行。两个 children 都在尝试创建目录。你只需要调用 fork() 一次:
cpid = fork();
if (cpid == -1) {
perror("fork failed");
}
头部保护是正确的,与您的问题无关。它们仅在编译时使用,以确保您的头文件仅包含一次。
即使有保护措施,我的文件仍会尝试执行两次 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: cannot create directory 'MyNewDirectory': File exists”。显然它正在创建目录,但随后又试图重新创建它。守卫不应该防止这些多次执行吗?这与叉子?这是第一次尝试使用自定义 header 文件。在此先感谢,如果这已经在某个地方得到回答,请告诉我,我将删除它。
您调用了 fork() 两次,因此您有 4 个不同的进程 运行。两个 children 都在尝试创建目录。你只需要调用 fork() 一次:
cpid = fork();
if (cpid == -1) {
perror("fork failed");
}
头部保护是正确的,与您的问题无关。它们仅在编译时使用,以确保您的头文件仅包含一次。