相同的程序在 C 中有效,但在 C++ 中无效(使用 linux 系统调用)
Same programm works in C, but not in C++ (uses linux system calls)
我应该为学校的 linux 写一篇(非常基础的)shell。目前我只是试图用它执行一个程序(通过 fork 和 execv),并且只打算稍后添加用户输入。我开始用 C 编写(我不知道 all/only 知道它与 C++ 共享的某些部分)因为幻灯片正在使用它,但我们可以使用 C 或 C++,我计划尽快使用 C++因为我了解了 C handles/doesn 不处理 input/output/strings 的方式。 (我从教授的幻灯片中提取了部分代码(主要是使用 status、fork、execv 和 wait 的行)并自己添加了部分代码。)
但是,当前使用 C 时,程序会编译、运行并显示预期的输出(通过调用 echo 函数打印出 "testdesecho")。但是,当将相同的代码复制粘贴到 C++ 并尝试对其进行编译时,我遇到了几个错误(不仅仅是警告),因此甚至无法编译代码。
这是代码
//#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
//#include <unistd.h>
/*
readparsefunc() {
}
*/
int main() {
int childPid;
int status;
char befehlstr[20] = "/bin/echo"; //location
char* parameterstr[61] = { "echo", "testdesecho" }; //argv
childPid = fork();
//befehlstr = "";
//parameterstr = " ";
//cout << parameterstr[1];
printf("%d", childPid); printf("<- childPid(test) \n");
printf(befehlstr); printf("<- befehlstr(test) \n");
printf(*parameterstr); printf("<- parameterstr(test) \n");
if (childPid == -1) { printf("Konnte keinen neuen Prozess erstellen"); }
else if (childPid == 0) {
printf("child process \n");
int testintueberlagerung = 0;
testintueberlagerung = execv(befehlstr, parameterstr);
if (testintueberlagerung != 0) {
printf("%d" "<- testueberlagerungswert \n", testintueberlagerung);
}
//execv(befehlstr, parameterstr);
exit(0);
}
else if (childPid > 0) {
printf("parent process \n");
wait(&status);
printf("parent process beendet sich nun auch \n");
}
/*
while (1 != 0) {
}
*/
return 0;
}
这些是错误:
testmitcanders.cpp:27:13: error: ‘fork’ was not declared in this scope
childPid = fork();
^~~~
testmitcanders.cpp:41:26: error: ‘execv’ was not declared in this scope
testintueberlagerung = execv(befehlstr, parameterstr);
^~~~~
testmitcanders.cpp:51:3: error: ‘wait’ was not declared in this scope
wait(&status);
^~~~
testmitcanders.cpp:51:3: note: suggested alternative: ‘main’
wait(&status);
^~~~
main
据我所知,这些都与系统调用有关,我不明白为什么需要在 C++ 中声明它们。但不是在 C 中?
(如果必须的话,我该如何申报?)
感谢您的帮助
旧版本的 C(大多数编译器仍然默认支持)具有未声明函数的默认类型概念。如果一个函数在声明之前被使用,C 假定函数的类型是 int (*)()
,即一个接受未知数量参数和 returns 和 int
的函数。所讨论函数的实际类型或多或少与该定义兼容,因此它似乎有效。
另一方面,C++ 没有未声明函数的默认类型,因此当使用未声明的函数时它会立即抛出错误。
对于 fork
和 exec
函数,您需要 #include <unistd.h>
,对于 wait
,您需要 #include <sys/types.h>
和 #include <sys/wait.h>
。
我应该为学校的 linux 写一篇(非常基础的)shell。目前我只是试图用它执行一个程序(通过 fork 和 execv),并且只打算稍后添加用户输入。我开始用 C 编写(我不知道 all/only 知道它与 C++ 共享的某些部分)因为幻灯片正在使用它,但我们可以使用 C 或 C++,我计划尽快使用 C++因为我了解了 C handles/doesn 不处理 input/output/strings 的方式。 (我从教授的幻灯片中提取了部分代码(主要是使用 status、fork、execv 和 wait 的行)并自己添加了部分代码。)
但是,当前使用 C 时,程序会编译、运行并显示预期的输出(通过调用 echo 函数打印出 "testdesecho")。但是,当将相同的代码复制粘贴到 C++ 并尝试对其进行编译时,我遇到了几个错误(不仅仅是警告),因此甚至无法编译代码。
这是代码
//#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
//#include <unistd.h>
/*
readparsefunc() {
}
*/
int main() {
int childPid;
int status;
char befehlstr[20] = "/bin/echo"; //location
char* parameterstr[61] = { "echo", "testdesecho" }; //argv
childPid = fork();
//befehlstr = "";
//parameterstr = " ";
//cout << parameterstr[1];
printf("%d", childPid); printf("<- childPid(test) \n");
printf(befehlstr); printf("<- befehlstr(test) \n");
printf(*parameterstr); printf("<- parameterstr(test) \n");
if (childPid == -1) { printf("Konnte keinen neuen Prozess erstellen"); }
else if (childPid == 0) {
printf("child process \n");
int testintueberlagerung = 0;
testintueberlagerung = execv(befehlstr, parameterstr);
if (testintueberlagerung != 0) {
printf("%d" "<- testueberlagerungswert \n", testintueberlagerung);
}
//execv(befehlstr, parameterstr);
exit(0);
}
else if (childPid > 0) {
printf("parent process \n");
wait(&status);
printf("parent process beendet sich nun auch \n");
}
/*
while (1 != 0) {
}
*/
return 0;
}
这些是错误:
testmitcanders.cpp:27:13: error: ‘fork’ was not declared in this scope
childPid = fork();
^~~~
testmitcanders.cpp:41:26: error: ‘execv’ was not declared in this scope
testintueberlagerung = execv(befehlstr, parameterstr);
^~~~~
testmitcanders.cpp:51:3: error: ‘wait’ was not declared in this scope
wait(&status);
^~~~
testmitcanders.cpp:51:3: note: suggested alternative: ‘main’
wait(&status);
^~~~
main
据我所知,这些都与系统调用有关,我不明白为什么需要在 C++ 中声明它们。但不是在 C 中? (如果必须的话,我该如何申报?)
感谢您的帮助
旧版本的 C(大多数编译器仍然默认支持)具有未声明函数的默认类型概念。如果一个函数在声明之前被使用,C 假定函数的类型是 int (*)()
,即一个接受未知数量参数和 returns 和 int
的函数。所讨论函数的实际类型或多或少与该定义兼容,因此它似乎有效。
另一方面,C++ 没有未声明函数的默认类型,因此当使用未声明的函数时它会立即抛出错误。
对于 fork
和 exec
函数,您需要 #include <unistd.h>
,对于 wait
,您需要 #include <sys/types.h>
和 #include <sys/wait.h>
。