1. 程式人生 > >黑馬《linux基礎程式設計》學習筆記(76到80)

黑馬《linux基礎程式設計》學習筆記(76到80)

七十六. 非阻塞讀終端

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MSG_TRY "try again\n"

// 非阻塞讀終端
int main(void)
{
	char buf[10];
	int fd, n;
    // /dev/tty --> 當前開啟的終端裝置
	fd = open("/dev/tty", O_RDONLY | O_NONBLOCK);
	if(fd < 0) 
	{
		perror("open /dev/tty");
		exit(1);
	}
	tryagain:
	n = read(fd, buf, 10);
	if (n < 0) 
	{
        // 如果write為非阻塞,但是沒有資料可讀,此時全域性變數 errno 被設定為 EAGAIN
		if (errno == EAGAIN) 
		{
			sleep(3);
			write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
			goto tryagain;
		}
		perror("read /dev/tty");
		exit(1);
	}
	write(STDOUT_FILENO, buf, n);
	close(fd);
	return 0;
}

 七十七. stat函式介紹

 

 七十八. 使用stat函式獲取檔案大小

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[])
{

    struct stat buf_st;
    int ret = stat("english.txt", &buf_st);
    if(ret == -1)
    {
        perror("stat error");
        exit(1);
    }

    printf("file size = %d\n", (int)buf_st.st_size);

    return 0;
}

 執行一下

[[email protected]_0_15_centos file_op]# gcc size_stat.c -o size_stat
[[email protected]_0_15_centos file_op]# ls
access.c  chown.c      ls-l.c   rename.c   size_stat.c  strtol.c
chmod.c   english.txt  newstat  size_stat  stat.c       truncate.c

[[email protected]_0_15_centos file_op]# ./size_stat
file size = 109055

 七十九. st_mode如何獲取檔案型別和許可權

 八十. st_mode如何獲取檔案型別和許可權——程式碼

首先是type_stat.c

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[])
{

    struct stat buf_st;
    int ret = stat("english.txt", &buf_st);
    if(ret == -1)
    {
        perror("stat error");
        exit(1);
    }

        if((buf_st.st_mode & S_IFMT) == S_IFREG)
        {
                printf("這個檔案是一個普通檔案\n");
        }

    return 0;
}

然後執行一下

[[email protected]_0_15_centos file_op]# vim type_stat.c
[[email protected]_0_15_centos file_op]# gcc type_stat.c -o type_stat
[[email protected]_0_15_centos file_op]# ls
access.c  chown.c      ls-l.c   rename.c   size_stat.c  strtol.c    type_stat
chmod.c   english.txt  newstat  size_stat  stat.c       truncate.c  type_stat.c
[[email protected]_0_15_centos file_op]# ./type_stat
這個檔案是一個普通檔案

然後接下來我們處理的是檔案許可權的檢視。

先是mode_stat.c

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char* argv[])
{

    struct stat buf_st;
    int ret = stat("english.txt", &buf_st);
    if(ret == -1)
    {
        perror("stat error");
        exit(1);
    }


        //所有者對檔案的操作許可權
        if(buf_st.st_mode & S_IRUSR)
        {
                printf("        r");
        }

        if(buf_st.st_mode & S_IWUSR)
        {
                printf("        w");
        }

        if(buf_st.st_mode & S_IXUSR)
        {
                printf("        x");
        }
    return 0;
}

執行

[[email protected]_0_15_centos file_op]# vim mode_stat.c
[[email protected]_0_15_centos file_op]# gcc mode_stat.c -o mode_stat
[[email protected]_0_15_centos file_op]# ls
access.c  english.txt  mode_stat.c  size_stat    strtol.c    type_stat.c
chmod.c   ls-l.c       newstat      size_stat.c  truncate.c
chown.c   mode_stat    rename.c     stat.c       type_stat
[[email protected]_0_15_centos file_op]# ./mode_stat