本文共 6120 字,大约阅读时间需要 20 分钟。
注意:
还可以通过系统定义的宏来判断文件类型、文件访问权限:
官方例子:
#include#include #include #include #include #include int main(int argc, char *argv[]){ struct stat sb; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } if (lstat(argv[1], &sb) == -1) { perror("lstat"); exit(EXIT_FAILURE); } printf("ID of containing device: [%lx,%lx]\n", (long) major(sb.st_dev), (long) minor(sb.st_dev)); printf("File type: "); switch (sb.st_mode & S_IFMT) { case S_IFBLK: printf("block device\n"); break; case S_IFCHR: printf("character device\n"); break; case S_IFDIR: printf("directory\n"); break; case S_IFIFO: printf("FIFO/pipe\n"); break; case S_IFLNK: printf("symlink\n"); break; case S_IFREG: printf("regular file\n"); break; case S_IFSOCK: printf("socket\n"); break; default: printf("unknown?\n"); break; } printf("I-node number: %ld\n", (long) sb.st_ino); printf("Mode: %lo (octal)\n", (unsigned long) sb.st_mode); printf("Link count: %ld\n", (long) sb.st_nlink); printf("Ownership: UID=%ld GID=%ld\n", (long) sb.st_uid, (long) sb.st_gid); printf("Preferred I/O block size: %ld bytes\n", (long) sb.st_blksize); printf("File size: %lld bytes\n", (long long) sb.st_size); printf("Blocks allocated: %lld\n", (long long) sb.st_blocks); printf("Last status change: %s", ctime(&sb.st_ctime)); printf("Last file access: %s", ctime(&sb.st_atime)); printf("Last file modification: %s", ctime(&sb.st_mtime)); exit(EXIT_SUCCESS);}
ps用来产看静态的进程统计信息,常用的选项如下:
注意,有些命令选项是不加-
的,所以经常将aux
和-elf
分布组合使用
ps aux
的执行结果如下:
注意:
?
表示未知或者不需要终端top用于动态查看进程的信息,默认三秒刷新一次,top
执行结果如下:
注意:
k
键来终止对应的进程Linux中/proc
目录是一种文件系统,即proc文件系统,proc文件系统是一种伪文件系统(虚拟文件系统),存储的是当前内核运行状态的一些特殊文件。
所以用户可以通过查看/porc
中的相关文件来获取系统硬件以及当前正在运行的进程的信息,其中有些文件虽然会返回进程相关的大量信息,但是实际大小却是0Byte,下面随便列出一个/proc
下一个进程的目录:
相关文件的说明参考链接:
linux中,每一个进程都是由其父进程创建的。此命令以可视化方式显示进程,通过显示进程的树状图来展示进程间关系。如果指定了pid了,那么树的根是该pid,不然将会是init(pid: 1)
htop与top很类似,但是htop是交互式的文本模式的进程查看器。它通过文字图形化地显示每一个进程的CPU和内存使用量、swap使用量。使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。Htop不是系统默认安装的,所以需要额外安装。
创建多个子进程
#include#include #include #include int main(int argc, const char *argv[]){ int n; pid_t pid; for (i = 0; i < 5; i++) { pid = fork(); if (pid < 0) { perror("fork"); } else if (pid == 0) { //进入子进程,直接返回,子进程不再fork子进程 printf("this is %d process, pid:%d, ppid:%d\n", i, getpid(), getppid()); exit(0); } else { wait(NULL); //等待 i 儿子 } } return 0;}
给出一个单向不循环链表的头结点,要求不改变链表结构的情况下反向遍历链表中的元素。
思路:递归实现,判断p是否为空,来输出元素。
代码:
#include#include #include typedef int data_t;typedef struct node { data_t data; struct node *next;}node;node *list_create();int list_show(node *H);node *list_pre_find(node *H, int post);int list_insert_post(node *H, int post, data_t val);int list_delete(node *H, int post);int list_free(node *H);int list_reverse_show(node *H);int main(int argc, const char *argv[]){ int i, n, num; printf("input num size :"); scanf("%d", &n); node *H = list_create(); printf("intput data:"); for (i = 0; i < n; i++) { scanf("%d", &num); list_insert_post(H, i, num); } list_show(H); /* 功能测试 */ list_delete(H, 0); list_show(H); list_insert_post(H, 0, 99); list_show(H); /* 递归反向遍历,不打印头结点数据,所以传入 H->next */ list_reverse_show(H->next); puts(""); list_free(H); return 0;}int list_reverse_show(node *H){ node *p = H; if (p != NULL) { list_reverse_show(p->next); //陷入递归,直到链表末尾开始返回,逐步执行printf printf("%d ", p->data); } return 0;}node *list_create(){ node *p = (node*)malloc(sizeof(node)); if (NULL == p) { printf("malloc filed\n"); return NULL; } memset(p, 0, sizeof(node)); p->next = NULL; return p;}int list_show(node *H){ if (NULL == H) { printf("H is NULL\n"); return -1; } node *p = H; printf("H->"); while (p->next != NULL) { p = p->next; printf("%d->", p->data); } printf("NULL\n"); return 0;}node *list_pre_find(node *H, int post){ if (NULL == H) { printf("H is NULL\n"); return NULL; } int i; node *p; p = H; for (i = 0; i < post; i++) { if (NULL == p) { printf("post is over!\n"); return NULL; } p = p->next; } return p;}int list_insert_post(node *H, int post, data_t val){ if (NULL == H) { printf("H is NULL\n"); return -1; } node *p, *q; p = list_create(); p->data = val; q = list_pre_find(H, post); p->next = q->next; q->next = p; return 0;}int list_delete(node *H, int post){ if (NULL == H) { printf("H is NULL\n"); return -1; } node *p = list_pre_find(H, post); node *q; q = p->next; p->next = q->next; free(q); q = NULL; return 0;}int list_free(node *H){ if (NULL == H) { printf("H is NULL\n"); return -1; } node *p = H; node *q; while (p != NULL) { q = p; p = p->next; free(q); } q = NULL; return 0;}
Linux中确定文件类型使用命令file
,使用方法为:
file filename
Linux中一切皆文件!!!
转载地址:http://htwzi.baihongyu.com/