我目前正在努力解决这个错误.我正在编写一个shell模拟器,使用fork()来执行使用execvp();的命令.几乎我尝试解析到我的shell的每个命令都工作得很好,除了没有参数的ls.如果我尝试执行ls -lah,一切正常,但是一个简单的ls不会,收到以下错误:
ls: fts_open: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是我的代码片段:(只是必不可少的)
pid = fork();
if (pid==0)
{
puts("CHILD");
puts(args[0]);
puts(args[1]);
printf("%d\n", strlen(args[1]));
args[2] = NULL;
execvp(args[0], args);
}
else wait(NULL);
puts("BACK TO PARENT");
}
Run Code Online (Sandbox Code Playgroud)
这是ls的输出:
ls
CHILD
ls
0
ls: fts_open: No such file or directory
BACK TO PARENT
Run Code Online (Sandbox Code Playgroud)
如你所见,args [0]包含ls,args [1]为空,因为没有参数,args [1]的长度为0,但我不断收到错误.
有什么想法吗?
编辑:
感谢Jonathan Leffler找到它:(同样,它似乎只是Mac上的一个问题)
关键是args [1]实际上并不是空的,因此,操作系统会尝试打开''文件,显然,该文件不存在,并且看起来不能创建,因为它不是真是个名字.
所以,这就是我所做的:检查args的len [1].如果为0,则将其设置为NULL.(只是释放内存并没有真正帮助)
pid = fork();
if (pid==0)
{
puts("CHILD");
puts(args[0]);
puts(args[1]);
if (strlen(args[1]) == 0)
args[1] = 0;
args[2] = NULL;
execvp(args[0], …Run Code Online (Sandbox Code Playgroud) 这可能很简单,但我无法克服它.我有一个嵌套映射的数据结构,如下所示:
(def m {:1 {:1 2 :2 5 :3 10} :2 {:1 2 :2 50 :3 25} :3 {:1 42 :2 23 :3 4}})
Run Code Online (Sandbox Code Playgroud)
我需要设置每一个m[i][i]=0.这在非函数式语言中很简单,但我不能在Clojure上使用它.考虑到我确实有一个具有各种可能值的向量,这样做的惯用方法是怎样的?(让我们称之为v)
做(map #(def m (assoc-in m [% %] 0)) v)会工作,但def在函数内使用map似乎不对.使m成为原子版并使用swap!似乎更好.但并不多,它似乎也很慢.
(def am (atom m))
(map #(swap! am assoc-in[% %] 0) v)
Run Code Online (Sandbox Code Playgroud)
这样做的最佳/正确方法是什么?
UPDATE
这里有一些很棒的答案.我在这里发布了一个后续问题Clojure:迭代与这些关系紧密相关的集合的映射,但没有那么多.
我在Clojure中实现了一个简单的算法,即使:jvm-opts ["-Xmx4G"]在我的设置上也要坚持吹内存project.clj.假设以下数据结构:
(def inf Double/POSITIVE_INFINITY)
(def min-dist (atom {:1 {:1 0 :2 4} :2 {:1 4 :2 0 :3 5} :3 {:2 5 :3 0}}))
(def vertexes [:1 :2 :3])
Run Code Online (Sandbox Code Playgroud)
以下内容将在较大的输入(|vertexes| = 100)上耗尽内存:
(for [k vertexes i vertexes j vertexes]
(do
(println " " i " " j " "k)
(let [s (+ (get-in @min-dist [i k] inf) (get-in @min-dist [k j] inf))]
(if (> (get-in @min-dist [i j] inf) s) (swap! min-dist assoc-in …Run Code Online (Sandbox Code Playgroud)