Когда я проверял переделку Makefiles, почему он вышел? - PullRequest
0 голосов
/ 06 марта 2019

Переделка-Makefiles
Я пытался проверить эту главу, в моем понимании, это должен быть бесконечный цикл, но это не так.

$ cat Makefile 
#/tmp/Makefile: ;
-include /tmp/include.mk
/tmp/generate:/tmp/generate_file.c
        gcc $< -o $@

/tmp/include.mk:/tmp/generate
        /tmp/generate $@
        /tmp/touch_file

/tmp/generate - это исполняемый файл, который может создать файл.
/tmp/touch_file - это исполняемый файл, который может обновлять отметку времени /tmp/generate.
Во втором обнаружении /tmp/generate новее /tmp/include.mk, почему бы и нет обновить это снова?

xuwl@xuwl:/tmp$ make
/tmp/generate /tmp/include.mk
/tmp/touch_file 
/tmp/generate last change time Wed Mar  6 10:59:53 2019
/tmp/generate /tmp/include.mk
/tmp/touch_file 
/tmp/generate last change time Wed Mar  6 11:08:48 2019
make: '/tmp/generate' is up to date.
xuwl@xuwl:/tmp$ stat /tmp/include.mk 
  File: '/tmp/include.mk'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 806h/2054d      Inode: 915845      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/    xuwl)   Gid: ( 1000/    xuwl)
Access: 2019-03-06 11:08:48.782753764 +0800
Modify: 2019-03-06 11:08:41.778754001 +0800
Change: 2019-03-06 11:08:41.778754001 +0800
 Birth: -
xuwl@xuwl:/tmp$ stat /tmp/generate
  File: '/tmp/generate'
  Size: 8768            Blocks: 24         IO Block: 4096   regular file
Device: 806h/2054d      Inode: 915856      Links: 1
Access: (0775/-rwxrwxr-x)  Uid: ( 1000/    xuwl)   Gid: ( 1000/    xuwl)
Access: 2019-03-06 11:08:55.782753529 +0800
Modify: 2019-03-06 11:08:55.782753529 +0800
Change: 2019-03-06 11:08:55.782753529 +0800
 Birth: -

touch_file.c - исходный код /tmp/touch_file

#include<stdio.h>
#include<time.h>
#include<unistd.h>
#include<sys/stat.h>
#include<fcntl.h>

#define GENERATEFILE "/tmp/generate"
int main(int argc, char* argv[])
{
        int fd = open(GENERATEFILE, O_RDWR);
        if(fd<0){
                perror("open file failed\n");
                return -1;
        }

        struct stat st;
        stat(GENERATEFILE,&st);
        printf("%s last change time %s",GENERATEFILE,ctime(&st.st_ctime));

        sleep(4);
        futimens(fd,0);

        close(fd);
        return 0;
}

generate_file.c является источником /tmp/generate
/tmp$ cat generate_file.c:

#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#include<errno.h>
#include<string.h>

int main(int argc, char* argv[])
{
        int fd=open(argv[1], O_CREAT|O_RDWR, 0666);
        if(fd<0){
                printf("open file %s error\n", argv[1]);
                return -1;
        }

        sleep(3);
        close(fd);

        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...