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));
}


因为您似乎做了很多事情。

10-04 20:28