1.创建孤儿进程
int main(int argc, const char *argv[])
{
pid_t cpid = fork();
if(cpid < 0)
{
perror("cpid");
return -1;
}
printf("%d\n", cpid);
if(cpid == 0) //进入子进程不退出
{
while(1)
{
sleep(1);
printf("I am child process\n"); //打印孤儿进程
}
}
if(cpid > 0) //父进程,显示后退出,进图子进程
{
printf("I am fathe process\n");
sleep(1);
}
return 0;
}
运行结果:
2、创建僵尸进程
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
pid_t cpid = fork();
if(cpid < 0)
{
perror("cpid");
return -1;
}
if(cpid != 0)
{
while(1) //通过死循环父进程不退出,子进程成为僵尸进程`
sleep(1);
}
return 0;
}
输出结果:
3、外部输入一个路径,要求显示该路径下,所有文件的详细信息,除了隐藏文件。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
char *getFiletype(mode_t mode, char buf[10])
{
int i = 0;
switch (mode & S_IFMT)
{
case S_IFBLK:
buf[i++] = 'b';
break;
case S_IFCHR:
buf[i++] = 'c';
break;
case S_IFDIR:
buf[i++] = 'd';
break;
case S_IFIFO:
buf[i++] = 'f';
break;
case S_IFLNK:
buf[i++] = 'l';
break;
case S_IFREG:
buf[i++] = '-';
break;
case S_IFSOCK:
buf[i++] = 's';
break;
default:
buf[i++] = '?';
break;
}
return buf;
}
char *getFilePermission(mode_t mode, char pre[10])
{
int i;
char per[] = "rwx";
for(i=0; i<9; i++)
{
if((mode & (0400 >> i)) == 0)
pre[i] = '-';
else
pre[i] = per[i%3];
}
return pre;
}
struct passwd *get_fileUsrName(uid_t uid)
{
struct passwd *_passwd = getpwuid(uid);
if(NULL == _passwd)
{
perror("getpwuid");
return NULL;
}
return _passwd;
}
struct group *get_fileGroupName(gid_t gid)
{
struct group *_group = getgrgid(gid);
if(NULL == _group)
{
perror("getgrgid");
return NULL;
}
return _group;
}
int main(int argc, const char *argv[])
{
//如果忘记传入变量,给出提示
if(argc < 2)
{
fprintf(stderr, "请输入目录名\n");
return -1;
}
//设置dp接收打开的目录
DIR *dp = opendir(argv[1]);
if(NULL == dp)
{
perror("opendir");
return -1;
}
int i = 0;
struct dirent *rp = NULL;
struct stat buf; //创建结构体变量buf,待会用来调用文件的各种状态信息
//开始循环调用输出目录里的各种文件的信息
while(1)
{
//获取dp中的目录信息
rp = readdir(dp);
if(NULL == rp) //读取完毕返回NULL
{
if(0 == perror)
{
printf("目录读取完毕\n");
break;
return 0;
}
else
{
perror("readdir"); //更新错误码,返回错误信息,发现错误的情况下
return -1;
}
}
// printf("%c\n", rp->d_name[0]);
if(rp->d_name[0] != '.') //如果首个字符是‘.’则排除,目的是为了将隐藏文件去掉
{
// printf("[%d] %s\n", i++, rp->d_name);
char copy[20] = "";
strcpy(copy, argv[1]); //因为argv不允许改变,const.
if(stat(strcat(copy,rp->d_name), &buf) < 0) //将传入的目录与读取到当前目录下的
//文件信息进行拼接,可以组成任意的路径,进行读取当前目录下的文件信息。
{
perror("stat");
return -1;
}
//获取文件类型
char ch[20] = "";
getFiletype(buf.st_mode, ch);
//获取文件执行权限
char pre[20] = "";
getFilePermission(buf.st_mode, pre);
//获取用户id和组id
struct passwd *_passwd = get_fileUsrName(buf.st_uid);
struct group *_group = get_fileGroupName(buf.st_gid);
//制作指针数组,存放月份,通过传入的日期转换作为下标进行打印。
char *Month[12] = {"一月", "二月", "三月", "四月", "五月", "六月", \
"七月", "八月", "九月", "十月", "十一月", "十二月"};
struct tm *t = localtime(&buf.st_ctime);
int mon = t->tm_mon;
int hour = t->tm_hour;
int min = t->tm_min;
//打印信息
printf("%s%s %ld %s %s %ld %s %0d:%0d %s\n", ch, pre, buf.st_nlink, _passwd->pw_name,\
_group->gr_name, buf.st_size, Month[mon], hour, min, rp->d_name);
}
}
if(closedir(dp) < 0)
{
perror("closedir");
return -1;
}
printf("close successful\n");
return 0;
}
输出结果:
ubuntu@ubuntu:Day3$ ./a.out ../
drwxrwxr-x 2 ubuntu ubuntu 4096 二月 22 9:49 Day1
drwxrwxr-x 2 ubuntu ubuntu 4096 二月 25 12:4 Day4
drwxrwxr-x 2 ubuntu ubuntu 4096 二月 23 10:27 Day2
drwxrwxr-x 2 ubuntu ubuntu 4096 二月 25 12:21 Day3
drwxrwxr-x 2 ubuntu ubuntu 4096 二月 23 21:42 fuxi
readdir: Success
ubuntu@ubuntu:Day3$ ls ../ -lh
总用量 20K
drwxrwxr-x 2 ubuntu ubuntu 4.0K 二月 22 09:49 Day1
drwxrwxr-x 2 ubuntu ubuntu 4.0K 二月 23 10:27 Day2
drwxrwxr-x 2 ubuntu ubuntu 4.0K 二月 25 12:18 Day3
drwxrwxr-x 2 ubuntu ubuntu 4.0K 二月 25 12:04 Day4
drwxrwxr-x 2 ubuntu ubuntu 4.0K 二月 23 21:42 fuxi