c lang,ubuntu
所以我有一个任务-用以下3个选项编写菜单:
1.关闭程序
2.显示用户ID
3.显示当前工作目录
我只能使用3个库-unistd.h,sys / syscall.h,sys / sysinfo.h。
所以没有printf / scanf
我需要使用给定的struct im数组,该数组具有一个函数指针,
调用用户想要使用的功能。
问题出在选项2和3上;
当我选择2时,第一次工作正常(我认为)
我第二次选择2,它可以工作,但是当进行第三次迭代时,
它不等待输入,出于某种原因将“ \ n”作为输入,然后说输入无效。 (我检查了printf作为输入的内容,我在重新计算索引后打印了索引,因为-39,所以它意味着selection [0] = 10 ='\ n')
那是第一个问题,我只是无法找到解决方案。
第二个问题是当前的工作目录功能;
SYS_getcwd由于某种原因返回-1,这意味着存在错误,但我无法弄清楚。
这些事情有什么解释吗?
(而且-slen和__itoa是我提供的函数-slen返回字符串的长度,
__itoa返回一个char *,它是整数的字符串表示形式)
helper.h:
typedef struct func_desc {
char *name;
void (*func)(void);
} fun_desc;
main.c:
#include <unistd.h>
#include "helper.h"
#include <sys/syscall.h>
#include <sys/sysinfo.h>
void exitProgram();
void printID();
void currDir();
int main() {
fun_desc arrFuncs[3];
arrFuncs[0].name = "exitProgram";
arrFuncs[0].func = &exitProgram;
arrFuncs[1].name = "printID";
arrFuncs[1].func = &printID;
arrFuncs[2].name = "currDir";
arrFuncs[2].func = &currDir;
char selection[2];
int index;
const char* menu = "Welcome to the menu. Please pick one of the following actions:\n1.Close the program\n2.Print the current user's id\n3.Print the current directory's id\n";
while(1 == 1) {
syscall(SYS_write, 0, menu, slen(menu));
syscall(SYS_write, 0, "Your selection: ", slen("Your selection: "));
syscall(SYS_read, 1, selection, slen(selection)); //might be a problem
selection[1] = '\0';
index = selection[0] - '0' - 1;
if(index > 2)
syscall(SYS_write, 0, "Invalid input\n", slen("Invalid input\n"));
else
arrFuncs[index].func();
}
return(0);
}
void exitProgram() {
syscall(SYS_write, 0, "The program will close\n", slen("The program will close\n"));
syscall(SYS_exit);
}
void printID() { //problem
char* uid = __itoa(syscall(SYS_getuid));
syscall(SYS_write, 0, uid, slen(uid));
syscall(SYS_write, 0, "\n", slen("\n"));
}
void currDir() { //????
char* buf = __itoa(syscall(SYS_getcwd));
syscall(SYS_write, 0, buf, slen(buf));
syscall(SYS_write, 0, "\n", slen("\n"));
}
最佳答案
您将错误数量的参数传递给其中一些系统调用。尤其是:
syscall(SYS_exit);
_exit()
有一个参数:退出代码。char* buf = __itoa(syscall(SYS_getcwd));
getcwd()
具有两个参数:指向要向其写入字符串的缓冲区的指针,以及该缓冲区的长度。实际上,这可能类似于:char pathbuf[PATH_MAX];
syscall(SYS_getcwd, pathbuf, sizeof(pathbuf));
如果没有定义
PATH_MAX
的标题,请自己定义。 4096是适当的值。请注意,
getcwd()
将字符串写入传递给它的缓冲区中-它不返回数字标识符。顺便说一句,您可能想通过实现包装器来写一个字符串来节省一些时间,例如
void putstring(const char *str) {
syscall(SYS_write, 0, str, slen(str));
}
因为您似乎做了很多事情。