C警告:函数'flock'的隐式声明仅适用于两个flock()调用之一

时间:2015-10-17 04:28:18

标签: c function warnings compiler-warnings flock

我改进了信号处理功能,但现在当我尝试通过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但它在主函数中没有抱怨它?我该怎么做才能纠正这个问题?我需要flock工作,以便我可以成功锁定和解锁文件。

2 个答案:

答案 0 :(得分:3)

如警告所示,flock功能在您第一次使用时为implicitly declared。由于它已经(隐式)在文件中先前声明,因此编译器不会抱怨以后的用法。

如果您注释掉第一个电话,那么它应该抱怨第二个电话。

您应该包含声明函数的头文件以消除警告。根据上面Joachim Pileborg评论中的manpage link,标题为<sys/file.h>

答案 1 :(得分:2)

您收到该警告是因为您尚未添加正确的#include(即您在没有明确声明的情况下使用了这些功能)。当函数没有给出显式原型时,编译器假定每个参数类型都是int。当实际函数参数类型的大小不等于int的大小时,这可能会导致意外行为。

GCC每个函数只发出一次此警告,因此您的构建输出不会被同一消息的页面混乱。

对于flock(),您需要#include <sys/file.h>

usleep()close()需要#include <unistd.h>