我想编译这个源代码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, const char *argv[]) {
While:
printf("MacBook-Pro-...:~ ...$ ");
char command[128];
gets_s(command);
if (strncmp(command, "exit", 4) == 0)
exit(0);
pid_t return_value = fork();
if (return_value == 0) {
int outfile;
if ((outfile = dup(1)) == -1)
return -1;
close(1);
if ((outfile = open("/Users/.../1.txt",
O_WRONLY | O_TRUNC | O_CREAT, 0644)) >= 0) {
execl("/bin/sh", "sh", "-c", command, NULL);
}
close(outfile);
exit(0);
} else {
wait();
FILE *fp;
char str[128];
fp = fopen("/Users/.../1.txt", "r");
while(!feof(fp)) {
if(fgets(str, 126, fp))
printf("%s", str);
}
fclose(fp);
goto While;
}
return 0;
}
但我有一些错误: 语义问题
系统:
产品名称:Mac OS X. 产品版本:10.12.1 BuildVersion:16B2555
Xcode Version 8.0(8A218a)
Apple LLVM 8.0.0版(clang-800.0.38) 目标:x86_64-apple-darwin16.1.0 线程模型:posix
答案 0 :(得分:0)
几乎没有问题:
Xcode没有看到函数定义,这就是为什么它说“隐含的函数声明'foobar'在C99中无效”。尽管Xcode尝试编译代码,假设在链接阶段将解析未知函数。对于exit
和wait
,它会起作用,但要取消警告,您只需要包含stdlib:#include <stdlib.h>
。
从gets_s
开始,您需要做一些额外的操作才能使其发挥作用(我不知道它来自哪里)。
第二个问题是wait
函数的签名如下所示:int wait(int *)
,而您没有给它任何参数。如果您不需要从子进程返回退出代码,只需添加0
或NULL
。