1

新しいユーザーなので、この説明が十分に明確でない場合は申し訳ありません...複数のソースファイル間で変更/使用される timespec 変数の作成に問題があります。私のプログラムは、最初のプログラム内から別のプログラムを実行するのにかかる時間を決定することを目的としているため、2 つのソース ファイルで時間を計測し、後で時間差を決定するために使用できるように保存する必要があります。私はインターネットを精査してさまざまなことを試しましたが、ソースファイルが変数のさまざまなインスタンスを作成しているように常に見えます

私のコードは基本的に次のようになります。

ヘッダー ファイル:

//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

ここでの問題は、何をするかについての誤解だと思いますfork。子プロセスに親プロセスのメモリのコピーを提供します。同じメモリではありません....まあ、実際には健全なアーキテクチャでは、コピーオンライトセマンティクスのない同じメモリですが、今のところ心配する必要はありません。

子プロセス (ここapp.cまでコンパイルすると仮定app) は、startTime の独自のコピーを変更し、親プロセスの startTime 変数を変更せずに終了します。

子プロセスから親プロセスに何かを伝えたい場合は、何らかの形式のプロセス間通信を使用する必要があります。

于 2015-09-08T15:36:08.080 に答える