C 警告:函数的隐式声明 'flock' 仅适用于两个 flock() 调用之一
C warning: implicit declaration of function 'flock' only applies to one of two flock() calls
我改进了我的信号处理功能,但现在当我尝试通过 gcc ./test2.c -Wall -Wextra
编译我的程序时,我收到以下信息;
./test2.c: In function 'end_app':
./test2.c:21: warning: implicit declaration of function 'flock'
./test2.c: In function 'main':
./test2.c:46: warning: implicit declaration of function 'usleep'
./test2.c:47: warning: implicit declaration of function 'close'
这是 test2.c
的源代码
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
static int end=0;
static int f;
static void end_app(int sig){
printf("Ending from sig#%d",sig);
struct sigaction si;
si.sa_handler=SIG_DFL;
si.sa_flags=0;
sigaction(SIGCHLD,&si,NULL);
sigaction(SIGTSTP,&si,NULL);
sigaction(SIGTTOU,&si,NULL);
sigaction(SIGTTIN,&si,NULL);
sigaction(SIGSEGV,&si,NULL);
sigaction(SIGTERM,&si,NULL);
sigaction(SIGHUP,&si,NULL);
flock(f,LOCK_UN); //compiler gives implicit declaration warning
printf("Ended\n");end=1;
}
void newsig(){
struct sigaction s,o;
o.sa_handler=SIG_DFL;
o.sa_flags=0;
s.sa_handler=&end_app;
s.sa_flags=SA_RESTART;
sigaction(SIGCHLD,&s,&o);
sigaction(SIGTSTP,&s,&o);
sigaction(SIGTTOU,&s,&o);
sigaction(SIGTTIN,&s,&o);
sigaction(SIGSEGV,&s,&o);
sigaction(SIGTERM,&s,&o);
sigaction(SIGHUP,&s,&o);
}
int main(){
f=open("xx.pid",O_WRONLY|O_CREAT|0x700);
flock(f,LOCK_EX); //function works here
printf("Started\n");
newsig();
while(1){
usleep(1000);
if (end==1){close(f);return 0;}
}
return 0;
}
我的问题是为什么编译器会抱怨在我的信号处理函数中使用了 flock 但它不会在 main 函数中抱怨它?我该怎么做才能纠正这个问题?我需要 flock 才能成功锁定和解锁文件。
正如警告所说,flock
函数是 implicitly declared 第一次使用它。因为它已经(隐含地)在文件的前面声明了,所以编译器不会抱怨后面的用法。
如果您注释掉第一个调用,那么它应该会抱怨第二个。
您应该包含声明函数的 header 文件以消除警告。根据上面 Joachim Pileborg 评论中的 manpage link,header 是 <sys/file.h>
。
您收到该警告是因为您没有添加正确的 #include
s(即您在没有明确声明的情况下使用了这些函数)。当一个函数没有给出显式原型时,编译器假定每个参数类型都是 int
。当实际函数参数类型的大小不等于 int
.
的大小时,这可能会导致意外行为
GCC 只对每个函数发出一次此警告,因此您的构建输出不会被相同消息的页面弄得乱七八糟。
flock()
你需要 #include <sys/file.h>
.
usleep()
和 close()
需要 #include <unistd.h>
.
我改进了我的信号处理功能,但现在当我尝试通过 gcc ./test2.c -Wall -Wextra
编译我的程序时,我收到以下信息;
./test2.c: In function 'end_app':
./test2.c:21: warning: implicit declaration of function 'flock'
./test2.c: In function 'main':
./test2.c:46: warning: implicit declaration of function 'usleep'
./test2.c:47: warning: implicit declaration of function 'close'
这是 test2.c
的源代码#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <fcntl.h>
static int end=0;
static int f;
static void end_app(int sig){
printf("Ending from sig#%d",sig);
struct sigaction si;
si.sa_handler=SIG_DFL;
si.sa_flags=0;
sigaction(SIGCHLD,&si,NULL);
sigaction(SIGTSTP,&si,NULL);
sigaction(SIGTTOU,&si,NULL);
sigaction(SIGTTIN,&si,NULL);
sigaction(SIGSEGV,&si,NULL);
sigaction(SIGTERM,&si,NULL);
sigaction(SIGHUP,&si,NULL);
flock(f,LOCK_UN); //compiler gives implicit declaration warning
printf("Ended\n");end=1;
}
void newsig(){
struct sigaction s,o;
o.sa_handler=SIG_DFL;
o.sa_flags=0;
s.sa_handler=&end_app;
s.sa_flags=SA_RESTART;
sigaction(SIGCHLD,&s,&o);
sigaction(SIGTSTP,&s,&o);
sigaction(SIGTTOU,&s,&o);
sigaction(SIGTTIN,&s,&o);
sigaction(SIGSEGV,&s,&o);
sigaction(SIGTERM,&s,&o);
sigaction(SIGHUP,&s,&o);
}
int main(){
f=open("xx.pid",O_WRONLY|O_CREAT|0x700);
flock(f,LOCK_EX); //function works here
printf("Started\n");
newsig();
while(1){
usleep(1000);
if (end==1){close(f);return 0;}
}
return 0;
}
我的问题是为什么编译器会抱怨在我的信号处理函数中使用了 flock 但它不会在 main 函数中抱怨它?我该怎么做才能纠正这个问题?我需要 flock 才能成功锁定和解锁文件。
正如警告所说,flock
函数是 implicitly declared 第一次使用它。因为它已经(隐含地)在文件的前面声明了,所以编译器不会抱怨后面的用法。
如果您注释掉第一个调用,那么它应该会抱怨第二个。
您应该包含声明函数的 header 文件以消除警告。根据上面 Joachim Pileborg 评论中的 manpage link,header 是 <sys/file.h>
。
您收到该警告是因为您没有添加正确的 #include
s(即您在没有明确声明的情况下使用了这些函数)。当一个函数没有给出显式原型时,编译器假定每个参数类型都是 int
。当实际函数参数类型的大小不等于 int
.
GCC 只对每个函数发出一次此警告,因此您的构建输出不会被相同消息的页面弄得乱七八糟。
flock()
你需要 #include <sys/file.h>
.
usleep()
和 close()
需要 #include <unistd.h>
.