a.c
とb.c
の2つのファイルがあります
a.c
で、b.c
にある関数に信号を送信しています
signal(SIGUSR1,doSomething);
A.cファイルの上に、次のものがあります。
extern void doSomething (int sig);
ただし、コンパイルするとエラーが発生します。
/tmp/ccCw9Yun.o:関数
main':
doSomething 'で
a.c:(.text+0xba): undefined reference to
collect2:ldが1つの終了ステータスを返しました
次のヘッダーが含まれています。
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
どうすれば修正できますか?
_a.o
_と_b.o
_の両方をリンクする必要があります。
_gcc -o program a.c b.c
_
各ファイルにmain()
がある場合、それらをリンクすることはできません。
ただし、_a.c
_ファイルにはdoSomething()
への参照が含まれ、doSomething()
を定義し、_a.c
_(main()
など)。
プロセスAからプロセスBの関数を呼び出すことはできません。関数にシグナルを送信することはできません。 kill()
システムコールを使用して、プロセスにシグナルを送信します。
signal()
関数は、プロセスがシグナルを受信したときに、現在のプロセス(プログラム)のどの関数がシグナルを処理するかを指定します。
これがどのように機能するか、つまりProgramAがどのプロセスIDにシグナルを送信するかをどのように知るかを理解するために、いくつかの真剣な仕事があります。 _b.c
_のコードは、信号ハンドラーとしてdosomething
を指定してsignal()
を呼び出す必要があります。 _a.c
_のコードは、単に他のプロセスにシグナルを送信します。
.cファイルで外部インターフェイスを定義するのは非常に悪いスタイルです。 。
これをする必要があります
ああ
extern void doSomething (int sig);
交流
void doSomething (int sig)
{
... do stuff
}
紀元前
#include "a.h"
.....
signal(SIGNAL, doSomething);
。
これに対する最初の反応は、2つのオブジェクトファイルがリンクされていることを確認することです。これは、コンパイル段階で両方のファイルを同時にコンパイルすることにより行われます。
gcc -o programName a.c b.c
または、個別にコンパイルする場合は、次のようになります。
gcc -c a.c
gcc -c b.c
gcc -o programName a.o b.o
リンカエラーが発生しているため、externは機能しています(コンパイラは_a.c
_を問題なくコンパイルしました)が、最後にオブジェクトファイルをリンクしようとするとexternを解決できませんでした-void doSomething(int);
は実際にはどこにも見つかりませんでした。外部を台無しにしましたか? doSomething
を取り、int
を返す_b.c
_で実際にvoid
が定義されていることを確認し、_b.c
_を忘れずにファイルリスト(つまり、あなたは_gcc a.c b.c
_だけでなく_gcc a.c
_のようなことをしています)
次のようにオブジェクトファイルをコンパイルしてリンクする必要があります。
gcc -c a.c
gcc -c b.c
gcc a.o b.o -o prog
doSomething関数が静的でないことを確認してください。