(只放出部分代码)
用户态进程:
我在这里只创建了两个进程 tty1 和 tty2 ,并且tty1 相当于 grome界面(我没写,只是放出来以作为区别)。
tty1登录的时候需要读取文件,由于我把 tty.c 文件放在了另一个文件夹,所以在用 fopen() 相对路径打开文件的时候出现了路径错误的问题,这里的路径起始位置是以入口 main 所存在的目录为相对路径的起始点,不然永远都打不开
#include "../sys/conf.h"
int startos() {
printf("hello\n");
exit(1);
}
int tty_host(char lname[256], char lpwd[256]) {
FILE* fp;
char str[256];
char name[256], pwd[256];
int i, len, flag;
flag = 0;
fp = fopen("./inittab/guestlist/passwd", "rb");
if(NULL == fp) {
printf("open file failed\n");
return ERROR;
}
while(!feof(fp)) {
fscanf(fp, "%s", str);
len = strlen(str);
if('N' == str[0]) { //NAME= 6个
for(i = 5; i < len; i++) {
name[i-5] = str[i];
}
flag = 1;
}
else if('P' == str[0]) { // PASSWORD= 9个
if(9 == len) {
memset(str, 0, sizeof(str));
}
else {
for(i = 9; i < len; i++) {
pwd[i-9] = str[i];
}
}
flag = 2;
}
if(2 == flag) {
if(!strcmp("admin", lname) && !strcmp(pwd, lpwd)) {
privallage = ADMIN;
fclose(fp);
startos();
}
else if(!strcmp(name, lname) && !strcmp(pwd, lpwd)) {
privallage = GUEST;
fclose(fp);
startos();
}
flag = 0;
}
}
fclose(fp);
printf("You are not allowed.\n");
return 0;
}
void tquit(int sig) {
printf("\nGood bye\n");
exit(0);
}
int getty() {
pid_t tty1, tty1_pid; // 终端一号 主用户
pid_t tty2, tty2_pid; // 终端二号
int stat_val, retval;
char name[256], pwd[256];
retval = 0;
tty1 = fork();
switch(tty1) {
case -1:
printf("fork failed\n");
break;
case 0:
(void) signal(SIGINT, tquit);
while(!retval) {
printf("Login:");
scanf("%s", name);
printf("Password:");
scanf("%s", pwd);
retval = tty_host(name, pwd);
}
break;
default:
printf("This is parent\n");
}
tty1_pid = wait(&stat_val);
printf("PID = %d %d\n", tty1_pid, stat_val);
return 0;
}
另外对于进程控制这里,tty1 为终端一号,即用来启动grome