1

新用户,如果这个解释不够清楚,我很抱歉......我在创建要在多个源文件之间修改/使用的 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 & 开始:0

希望这段代码能够理解我正在尝试做的事情。当它派生并执行另一个程序时, startTime 的值会改变但不会保持,因此当我稍后在父进程中调用它时。该值将只是它的初始值而不是时钟时间。似乎对此事的任何想法将不胜感激!

补充说明:我将 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
4

2 回答 2

2

你试图做的事情是行不通的。只有当多个源文件链接到同一个可执行文件时,这样的共享变量才有效,即使这样也仅适用于给定的正在运行的进程。

您需要让子进程在启动时向父进程发送一条消息,最好是通过管道,此时父进程知道子进程何时启动并可以clock_gettime再次调用。

于 2015-09-08T15:34:37.453 回答
2

我认为您的问题是对功能的误解fork。它为子进程提供了父进程内存的副本。不一样的内存....实际上,在健全的架构上,它是相同的内存,没有写时复制语义,但现在不要担心。

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

如果您想让子进程与父进程进行通信,则需要使用某种形式的进程间通信。

于 2015-09-08T15:36:08.080 回答