所以我在C中构建一个Unix minishell,并且正在实现输入,输出和错误重定向,并且遇到了文件问题.我在循环中打开我的文件,在那里我找到重定向操作符,并使用open(),它返回一个fd.然后我相应地分配孩子的fd,并调用执行函数.
当我的shell刚出去找程序,并用execvp()执行它们时,我没有太大的问题.唯一的问题是在提示输入下一个命令行之前,我是否需要在文件描述符上调用close().我担心fd泄漏,但不完全理解它是如何工作的.
使用内置命令时出现了真正的问题.我有一个名为"read"的内置命令,它接受一个参数,一个环境变量名称(可能是一个尚不存在的名称).然后读取提示输入值,并将该值赋给变量.这是一个例子:
% read TESTVAR
test value test value test value
% echo ${TESTVAR}
test value test value test value
Run Code Online (Sandbox Code Playgroud)
好吧,让我说我尝试这样的事情:
% echo here's another test value > f1
% read TESTVAR < f1
% echo ${TESTVAR}
here's another test value
Run Code Online (Sandbox Code Playgroud)
这很好用,请记住read在父进程内执行,我不用execvp调用read,因为它是内置的.读取使用获取,需要流变量,而不是fd.所以在浏览了irc论坛之后,我被告知要使用fdopen来从文件描述符中获取流.所以在打电话之前,我打电话给:
rdStream = fdopen(inFD, "r");
Run Code Online (Sandbox Code Playgroud)
然后打电话
if(fgets(buffer, envValLen, rdStream) != buffer)
{
if(inFD) fclose(rdStream);
return -1;
}
if(inFD) fclose(rdStream);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,目前我正在使用fclose()关闭流,除非它等于stdin(为0).这有必要吗?我需要关闭流吗?或者只是文件描述符?或两者?我很困惑我应该关闭它,因为它们都以不同的方式引用同一个文件.目前我还没有关闭fd,但我认为我绝对应该.我希望有人帮助确保我的shell没有泄漏任何文件,因为我希望它能够在单个会话中执行数千个命令而不会泄漏内存.
谢谢,如果你们想让我发布任何代码,请问.
所以,我正在尝试编写一个算法croot(k,n),它返回n的第k个根,n == n.我得到了大多数正确的答案,但它给了我一些奇怪的陈述,这些陈述似乎对某些数字是错误的.这是一个例子.
import cmath
def croot(k, n):
if n<=0:
return None
return cmath.exp((2 * cmath.pi * 1j * k) / n)
for k in range(8):
print croot(k, 8)
Run Code Online (Sandbox Code Playgroud)
输出是:
(1+0j)
(0.70710...+0.70710...j)
(6.12323399574e-17+1j)
Run Code Online (Sandbox Code Playgroud)
哇哇哇哇 所以k = 2和n = 8时的根是错误的,因为它应该是i,它将表示为1j,或j,或1.00000j等.有人可以帮助我吗?我这样做是因为我正在尝试编写FFT算法.我对复杂的数字和Python不是很有经验,所以我很可能犯了一个简单的错误.
谢谢,
如果你们需要任何其他信息,请询问.
所以,我正在构建一个简单的库存系统。该信息将存储在远程 SQL Server 2005 数据库中。在我正在处理的项目的当前部分,我需要扫描条形码(其中包含两个数据,员工 ID 和产品 ID)。我们将使用 MC9090-G 扫描仪。在它被扫描的同时,它会坐在秤上。我需要把这三块数据放在一起,上传到数据库中。
首先,我需要弄清楚如何收集数据。其次,我需要找出编写客户端应用程序的最佳平台。这些将相当简单,例如插入上述数据。我不确定是否应该使用 ACCESS 2010 前端,或者用其他东西编写前端。
如果这个问题看起来很模糊,我很抱歉,请向我询问更多详细信息。谢谢你们的帮助,我真的迷路了。