别介意所有的“为什么?”,“没用?”和“不要打扰”的评论。我想使用 clang 在另一个程序中编译一个程序。我可以创建NSTask
并设置参数,如果文件存在(即没有流),它将工作,并写入物理文件。我无法得到我真正想要的,即使用流进行输入和输出。我知道如果您使用 -xc 和 - 选项,clang 和 gcc 都允许编译标准输入,但无法使用管道实现该功能。我也不确定如何将 clang 的输出重定向到文件句柄或流。
这是我编译它并在 outfile 中生成正确输出的代码
task = [[NSTask alloc] init];
NSPipe* outputPipe = [[NSPipe alloc] init];
[task setStandardOutput:outputPipe ];
[task setStandardError: [task standardOutput]];
NSPipe* inPipe = [NSPipe pipe];
[task setStandardInput:inPipe];
[task setLaunchPath:@"/usr/bin/clang"];
NSString* outfile= [NSString stringWithFormat:@"%@.out",[[filename lastPathComponent] stringByDeletingPathExtension]];
//[data writeToFile:@"file.c" atomically:YES];
[task setArguments:[NSArray arrayWithObjects:filename,@"-S",@"-o",outfile,nil]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getData:)
name: NSFileHandleReadCompletionNotification
object: [[task standardOutput] fileHandleForReading]];
[[[task standardOutput] fileHandleForReading] readInBackgroundAndNotify];
[task launch];
我尝试将其用于输入流:
/* on pipe creation*/
dup2([[inPipe fileHandleForReading] fileDescriptor], STDIN_FILENO);
NSFileHandle* curInputHandle = [inPipe fileHandleForWriting];
/* tried before launch and after, no output just sits */
[curInputHandle writeData:[NSData dataWithContentsOfFile:filename]];
有时,我假设当管道关闭而 NSTask 仍然存在时,输出文件被创建并运行。这让我觉得 clang 只是在等待 stdin 关闭。读取数据后有没有办法关闭管道?
对于输出,我尝试使用 NSPipe 的 fileHandleForWriting 作为 -o 的参数,这给出了[NSConcretePipe fileSystemRepresentation]
无法识别的选择器的错误。我尝试使用 stdout 的文件描述符创建一个文件句柄,以解决相同的错误。我不知道任何重定向它的命令行参数。我尝试使用|
重定向但无法使其正常工作。如果有任何 unix 魔法可以重定向它,我可以将 stdout 复制到我想要的任何地方。
那么有没有办法在读取所有数据时关闭管道?和重定向铿锵声输出?如果有任何其他方法可以更轻松或更清洁地完成相同的事情,我愿意接受任何实施。对这两个项目的任何帮助都会非常棒。