欢迎加入QQ:498903810 一起交流、讨论知识,里面有大佬,也有小白,天下码农一家亲,大家一起讨论进步。
优化ls -l的获取权限方式点击查看
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>
#include <grp.h>
int main()
{
int j = 0;
struct stat st;
if(stat("stat.c", &st) < 0)
{
perror("stat");
return -1;
}
for(j = 8; j >= 0; j--)
{
if(st.st_mode & (1 << j))
{
if(j % 3 == 2)
printf("r");
else if(j % 3 == 1)
printf("w");
else if(j % 3 == 0)
printf("x");
}
else
printf("-");
}
return 0;
}
进程来啦!!!点击获取源代码
main()
函数,进程的准备
1.main
函数
一个程序运行起来就是一个进程,我们真实的代码是先进行链接,就是把C文件各个段进行组合,这个过程需要连接器,为我们作引导此时也就链接到我们的*.o
文件里(其中最重要的是main()
函数里面的参数,就是此时进入目标文件)。接着就需要加载器,将我们的代码加载进固定的虚拟地址。这个就是一个进程的完整步骤 。
2.程序的终止
(1)程序正常终止:
方式:exit()
、_exit()
、return
。
exit()
:C语言库,会在程序结束之前进行缓冲区的清除;
_exit()
:系统API,不会在程序结束之前进行缓冲区的清除,直接推出进程。
#include <unistd.h>
int dup(int oldfd);//返回一个新的文件描述符,成功返回描述符,失败返回-1
int dup2(int oldfd, int newfd);//指定新的文件描述符,成功返回的描述,失败返回-1
dup2指定新的描述符,如果指定的描述符已经被占用,就把之前已经占用的描述符关闭,分配自己指定的描述符。
我们的printf()也是写文件,不过是写到流文件描述符是(1,1是标准输出)的那个文件。
alarm()
函数
//头文件
#include <unistd.h>
//函数
unsigned int alarm(unsigned int seconds);
//描述
alarm() arranges for a SIGALRM signal to be delivered to the calling process in seconds seconds.
If seconds is zero, any pending alarm is canceled.
In any event any previously set alarm() is canceled.
signal()
函数
头文件
#include <signal.h>
//函数指针
typedef void (*sighandler_t)(int);
//函数原型
sighandler_t signal(int signum, sighandler_t handler);
例:
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
//真实的信号处理函数
//typedef void (*sighandler_t)(int); 函数指针
void func(int sig)//回调函数
{
//printf("sig = %d\n", sig);
if(sig == 14)
printf("hello world\n");
}
int main()
{
//操作系统2S之后会发一个信号SIGALRM给你的当前进程
alarm(