【问题标题】:How to create a file using execl command in c如何在c中使用execl命令创建文件
【发布时间】:2013-04-06 13:40:51
【问题描述】:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#define MAXLINIE 100


main(int argc, char* argv[]) {
    if (fork()==0){

        execl("/bin/> temporar.txt", "/bin/> temporar.txt", ">temporar.txt", NULL);

    }
}

基本上,我要做的是使用 unix 中的进程创建文件,这是我的代码,但由于某种原因它不起作用,我不太了解 execl 命令以及为什么前两个参数必须相同:execl("/bin/ls", "/bin/ls", "-l", NULL); 这很好用,有人可以帮帮我吗?

非常感谢!

【问题讨论】:

  • "/bin/&gt; temporar.txt" 背后的想法是什么?
  • 最后一个参数应该是(char *) NULL,而不是NULL
  • 所有参数都将作为可变参数传递,具有void* 类型。无论如何,C 接受某种隐式转换,所以 NULL 即使对于 char* 也是可以的。
  • @Ioentar:逐字逐句来自man execlThe list of arguments must be terminated by a NULL pointer, and, since these are variadic functions, this pointer must be cast (char *) NULL.
  • 你是对的。那是用man execl写的,它应该是理想的。但这对 C 来说不是问题。更不用说(char*)NULL 甚至 execl 实现。如果您在启用最大警告级别的情况下编译 execl(..., NULL),您将不会收到任何关于隐式转换为 char* 的警告。

标签: c unix process os.execl


【解决方案1】:

首先搜索whereistouch

~$ whereis touch
touch: /bin/touch /usr/bin/touch /usr/bin/X11/touch 

使用:int execl(const char *path, const char *arg, ...);

execl("/bin/touch", "touch", "filename", NULL);
          ^            ^         ^         ^
       command       command   argument    
        path           name
                     arg 0     arg 1    

【讨论】:

    【解决方案2】:

    考虑使用 system() 代替:

    system("/bin/ls -l > temporar.txt");
    

    或使用 execl 调用/bin/sh 重定向流:

    execl("/bin/sh", "/bin/sh", "-c" , "/bin/ls -l >temporar.txt", NULL);
    

    execl 的第一个参数是要执行的命令,第二个是要传递给命令的第一个参数(argv[0]),第三个和下一个 - 其他参数 argv[1] ...

    【讨论】:

    • 我不允许使用系统,我必须自己创建进程,我不想要所有的“ls -l”,只创建文件
    • 当我像这样“execl("/bin/sh", "/bin/sh", "/bin/>temporar.txt" 运行它时出现“没有这样的文件或目录”错误, 空值);”因为我只想在我启动 c 源的文件夹中创建一个文件,所以 ls-l 是一个有效的示例,我已经尝试将它调整到我的问题
    • 抱歉,忘记传递 -c 标志
    猜你喜欢
    • 2021-02-06
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2015-05-28
    • 2023-03-08
    • 2015-10-17
    • 2013-09-16
    相关资源
    最近更新 更多