在多个源文件中使用的struct timespec:C

时间:2015-09-08 15:19:59

标签: c struct header extern timespec

新用户如果这个解释不够清楚,我很抱歉...我在创建timespec变量时遇到了问题,这些变量要在多个源文件之间进行修改/使用。我的程序用于确定从我的初始程序中执行另一个程序所需的时间,因此我需要在两个源文件中计时并存储它以便稍后用于确定时间差。我一直在搜索互联网并尝试不同的东西但似乎我的源文件似乎创建了不同的变量实例

这是我的代码基本上是什么样的:

标题文件:

//shared.h
#ifndef shared_h
#define shared_h
#include<time.h>

extern struct timespec callTime, startTime;

#endif

源文件1:

//shared.c
#include "shared.h"

struct timespec startTime = {0}, callTime = {0};

源文件2:

//app.c
#include "shared.h"
#include <time.h>

void main(){
clock_gettime(CLOCK_MONOTONIC, &startTime);
}//end of main

源文件:

//timer.c
#include "shared.h"
#include <time.h>

void main(){

pid_t pid = fork();

clock_gettime(CLOCK MONOTONIC, &callTime);
if(pid == 0){
    execvp("./app", NULL);
    return 0;
}//end of if

printf("Call: %ld & Start: %ld\n", callTime.tv_sec, startTime.tv_sec);

return 0;
}//end of main

我会得到类似......

  

致电:14928304940&amp;开始时间:0

希望这段代码能够解决我想要做的事情。当它分叉并执行另一个程序时,startTime的值会改变但不会保持不变,以便稍后在Parent进程中调用它。该值只是它的初始值而不是时钟时间。似乎对此事的任何想法都会非常感激!

添加注意:我将shared.c与timer.c和app.c单独链接,然后运行timer.c

gcc shared.h
gcc -c shared.c
gcc -c app.c
gcc -c timer.c
gcc -o app app.o shared.o
gcc timer.o shared.o
./a.out

2 个答案:

答案 0 :(得分:2)

您尝试做的事情不会奏效。像这样的共享变量只有在多个源文件链接到同一个可执行文件时才有效,即使只有给定的运行进程。

您需要让子进程在启动时向父进程发回消息,最好是通过管道,此时父进程知道子进程何时启动,并且可以调用clock_gettime秒时间。

答案 1 :(得分:2)

我认为你的问题是对fork的误解。它为子进程提供父进程内存的副本。不是相同的内存....实际上,在理智的架构中,它是相同的内存,没有写入时复制语义,但现在不用担心。

您的子进程(假设此处app.c编译为app)将修改其自己的startTime副本,然后退出,无需修改父进程startTime变量。

如果您希望子进程将某些内容传递回父进程,则需要使用某种形式的进程间通信。