0
所有,我运行程序和下面处接收的问题的端部的输出。我不确定这是否是我对execl理解上的差距,或者如果我在这里完全错误地做了某些事情。该代码是相当直接的,并且参数/输出被说明如下:叉()&EXECL - 无法运行外部过程
编辑:固定的sizeof(ARG),以反映arg的实际尺寸;不过,因为你可以看到它返回一个令人费解的“1”,但它应该是大小的2
int shell (int argc, char *argv[]) {
char *s; /* user input string */
tok_t *t; /* tokens parsed from input */
int lineNum = 0;
int fundex = -1;
pid_t pid = getpid(); /* get current processes PID */
pid_t ppid = getppid(); /* get parents PID */
printf("%s running as PID %d under %d\n",argv[0],pid,ppid);
lineNum=0;
fprintf(stdout,"%d: ",lineNum);
while ((s = freadln(stdin))) {
t = getToks(s); /* Break the line into tokens */
fundex = lookup(t[0]); /* Is first token a shell literal */
if (fundex >= 0) cmd_table[fundex].fun(&t[1]);
else { /* Treat it as a file to exec */
cmd_fork(t);
}
fprintf(stdout,"%d: ",++lineNum);
}
return 0;
}
int cmd_fork(tok_t arg[]) {
size_t size = 120;
int i, status = 0;
pid_t childPid;
char *nargs = (char *) malloc(size);
printf("sizeof arg: %lu\n", (sizeof(arg)/sizeof(tok_t))); // returns 1?
if ((sizeof(arg)/sizeof(tok_t)) >= 2) {
printf("arg0: %s, arg1: %s\n", arg[0], arg[1]);
if (sizeof(arg) > 2) {
for (i=1; i < sizeof(arg); i++) {
if (i > 1) {
strcat(nargs, " ");
}
strcat(nargs, arg[i]);
printf("Nargs: %s\n", nargs);
}
}
execl(arg[0], arg[0], nargs, NULL);
_exit(127);
}
if (childPid > 0) {
waitpid(childPid, &status, 0);
printf("Exit status of process was %d\n", status);
} else {
printf("Child failed");
}
return 0;
}
输出:
./shell running as PID 3595 under 1833
0: /usr/bin/wc /home/vagrant/example
T0: /usr/bin/wc, T1: /home/vagrant/example
arg0: /usr/bin/wc, arg1: /home/vagrant/example
sizeof arg: 1
/usr/bin/wc: invalid zero-length file name
Exit status of process was 256
我不太清楚发生了什么事情不对,但会非常感谢任何正确方向的指针。
谢谢
莫
'sizeof(arg)'不会给你在该数组中的“元素数量”。 – 5gon12eder 2014-09-25 23:13:53
大有赶超@ 5gon12eder它一直以来,我写任何C.更新了一个令人费解的结果,而:'的sizeof(阿根廷)/的sizeof(ARG [0])'返回1;因此,'的sizeof(ARG)/的sizeof(tok_t)'也为1。但是,阵列的大小为两个,这两个条目是'tok_t'。我添加主)代码(/它是如何现在叫... – Momer 2014-09-25 23:41:18
'的sizeof(阿根廷)/的sizeof(ARG [0])'是错误的,太。尽管被声明为使用数组语法,但是'arg'是这里的一个*指针*和'sizeof(arg)== sizeof(tok_t *)',可能是8或者4,与“数组大小”无关。您需要添加一个带有元素数量的额外参数。 – 5gon12eder 2014-09-25 23:43:48