拆分不同文件中的进程

时间:2012-06-21 17:33:26

标签: c ipc multiprocessing pipe header-files

所以我制作了一个程序,使用四个不同的进程来做一些事情。我工作得很好,但现在我想把它拆分,所以每个进程都有自己的.c文件。我尝试使用头文件“processes.h”来执行此操作,该文件具有所有进程的函数原型。它看起来像这样:

#ifndef PROCESSES_H_
#define PROCESSES_H_

/*------------------------------------------------------------------------------
                definitions (defines, typedefs, ...)
------------------------------------------------------------------------------*/
#define NR_OF_PROCESSES 4

enum errCode {
    ERR_NONE = 0, ERR_SYNTAX, ERR_OPEN, ERR_TOKEN, ERR_ARG, ERR_END
};
typedef enum errCode ErrCode;

enum toktype {
    NUMBER = 0, OPERATOR, ENDOFLINE, ENDOFFILE
};
typedef enum toktype Token;


/*------------------------------------------------------------------------------
                function prototypes               
------------------------------------------------------------------------------*/
void readProcess(int pfds[5][2]);
void tokenProcess(int pfds[5][2]);
void calculatorProcess(int pfds[5][2]);
void errorProcess(int pfds[5][2]);

/*------------------------------------------------------------------------------
                global variable declarations                   
------------------------------------------------------------------------------*/
void (*functionTable[NR_OF_PROCESSES]) (int pfds[5][2]) = {
    readProcess,
    tokenProcess,
    calculatorProcess,
    errorProcess
};


#endif /*PROCESSES_H_*/

所有包含#include“processes.h”函数实现的.c文件,以及main函数(使用functionTable设置进程)也包括processes.h。

当我尝试编译时,我收到错误:

ld: duplicate symbol _functionTable in /var/folders/eH/eHF8LmdvHzSsNgT01V3jyk+++TI/-Tmp-//ccDgTW2X.o and /var/folders/eH/eHF8LmdvHzSsNgT01V3jyk+++TI/-Tmp-//ccp7zO9L.o
collect2: ld returned 1 exit status

这是分割成不同文件的正确方法吗?或者我是否需要为每个.c文件单独的.h文件?

2 个答案:

答案 0 :(得分:0)

把它放在.h:

extern void *functionTable;

然后将其放在一个文件中,例如源文件“main()”:

#include "processes.h"
...
void (*functionTable[NR_OF_PROCESSES]) (int pfds[5][2]) = {
    readProcess,
    tokenProcess,
    calculatorProcess,
    errorProcess
};

答案 1 :(得分:0)

这样做的一种方法是放

#ifdef GENERATE_DEFINITIONS
#define EXTERN
#define INITIALIZE(x) = x
#else
#define EXTERN extern
#define INITIALIZE(x)
#endif

EXTERN void (*functionTable[NR_OF_PROCESSES]) (int pfds[5][2])
  INITIALIZE({
    readProcess,
    tokenProcess,
    calculatorProcess,
    errorProcess
  });

在processes.h中然后放入

#define GENERATE_DEFINITIONS

之前的

#include "processes.h"

只在其中一个源文件中(例如,包含main()的文件)。