- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 C 程序来软链接(soft link) Unix 上的 2 个文件。在 Unix 中,此命令为:
ln -s oldfile newlink
所以我编写了一段代码来创建参数的 char *
数组,如下所示:
char *args[4];
args[0] = "ln";
args[1] = "-s";
args[2] = argv[2]; //argv[2] is the name of the old file
args[3] = argv[3]; //argv[3] is the name of the new soft link file
execvp(args[0], args);
但是 Linux 处理器不读取 -s 标志。我怎样才能重写它以处理 -s 标志?我也尝试使用 execlp 来做到这一点:
execlp(args[0], args[0], args[1], args[2], args[3], NULL);
但这也行不通。我在这些方面做错了什么?
编辑:我也尝试过 symlink() 命令,但我认为我的 Linux 版本不支持它,除非我错了并且我的代码中有缺陷:
char *args[4];
args[0] = "symlink";
args[1] = argv[2];
args[2] = argv[3];
args[3] = NULL;
execvp(args[0], args);
最佳答案
write a C code to soft-link 2 files on linux
为了该特定目的,您不需要启动 /bin/ln
在您的 C 代码中进行处理。您应该使用 symlink(2)系统调用(将由 ln
进程使用);这更简单,也更快。不要忘记检查其是否成功。请注意 symlink
是 system call (即使是旧的 Linux 内核也应该有)作为 C 函数,而不是命令(所以实际上你不能运行任何
命令或 shell 中的 executable)。根据记录,您需要symlink
#include <unistd.h>
在你的 C 源文件中。另请阅读symlink(7) .
symlink
系统调用例如,执行相当于 ln -s ~/somefile /tmp
的操作您首先需要计算对应于 ~/somefile
的路径(例如使用 snprintf(3) ...) (作者 using getenv
...):
char* somefilepath = "somefile";
char oldpathbuf[256];
snprintf(oldpathbuf, sizeof(pathbuf), "%s/%s", getenv("HOME"), somefilepath);
/// missing detecting and handling of errors in above
(我让您处理所有错误情况,包括 snprintf
缺少空间,它们很重要!)
然后您需要计算新链接的路径(您不能在目录上使用 symlink
系统调用):
char newpathbuf[256];
snprintf(newpathbuf, sizeof(newpathbuf), "/tmp/%s", somefilepath);
(再次处理错误,并思考如果 somefilepath
以 ../
开头会发生什么)
最后,进行系统调用,但检查是否失败:
if (symlink(newpathbuf, oldpathbuf)) {
perror("symlink");
exit(EXIT_FAILURE);
}
/bin/ln
程序如果您坚持(错误地恕我直言)使用 execve(2)系统调用 /bin/ln
或一些exec(3)函数(将调用 execve
),请务必显式添加 NULL
指针。顺便说一句,关于成功这些exec
函数不会返回,因此您可能需要调用 fork(2)使用之前和使用waitpid(2)之后。
请注意 execvp
使用 PATH
variable 。所以就这样过去了ln
它可能会运行(如果您的用户有一个奇怪的 $PATH
设置)除 /bin/ln
之外的其他东西(该文件路径在 Linux FHS 和 POSIX 中指定)会产生一些意想不到的副作用。但请参阅environ(7) .
the -s flag is not read by the Linux processor
不涉及“Linux 处理器”。 -s
标志由 /bin/ln
处理executable程序(其 main
函数获取扩展的程序参数,然后调用 symlink
系统调用)。你需要了解更多unix shell的作用和什么globbing命令是什么以及命令是怎样的expanded通过外壳。
我建议阅读Advanced Linux Programming和 intro(2)和 syscalls(2)手册页。
您可能应该阅读有关 Operating Systems 的更多信息并了解命令和系统调用的区别以及各自的作用Unix shell 。我建议阅读免费提供的 Operating Systems : Three Easy Pieces
关于c - 使用带有标志的 execvp 或 execlp 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43929328/
POSIX 系统公开了一系列 exec 函数,这些函数允许将可能不同的东西加载到当前进程中,保持打开的文件描述符、进程标识符等。 这可以出于多种原因完成,在我的例子中,这是自举——我想更改我自己进程的
我有一个用 c 编写的程序,它使用 execvpe(3) 函数,并且我设置了一行以包含必需的头文件: #include 我使用以下命令编译此文件... gcc foo.c -o foo ...仅收到
我在 C 中有一个函数,它创建一个子进程并使其运行 execvp。 int Execute(char **arg) { pid_t pid; int status; if ((
我正在使用 C 编写一个非常基本的 UNIX shell。在这个项目中,我试图使用 fork() 和 execvp() 来执行实际的 shell命令。我遇到了一个问题,它似乎可以很好地处理具有单个参数
我无法获得使用 execvp 调用的程序的完整输出。在这里,我基本上是在尝试用一个可以过滤输入和输出的程序来包装任何程序: #define BUF_SIZ 8192 int main(int argc
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在尝试用 c 语言创建一个 shell,当前正在尝试 ls 命令,但子进程总是返回 execvp 无法工作。这是函数。首先,我使用 exec 获取我所在的路径和从 stdin 获取的命令,这就是为
我正在开发这个程序,使用系统调用 execvp() 和 fork() 来运行通过命令行参数给出的 shell 命令。这里 arglist 是一个二维数组,其中包含命令名称及其参数列表。我将命令名称作为
我尝试使用 execvp 创建一个作为参数给出的存储库。但我遇到了一些无法在以下代码中解决的段错误(核心转储): #include //mkdir #include #include //p
我正在尝试使用 execvp 对文件进行排序,这是我的代码。 char *argv1[]={ "sh", "-c", "sort input.txt > output.txt", NULL }; 问题
我正在c中测试execvpe(),我尝试了下面的代码,这导致错误“函数‘execvpe’的隐式声明在C99 [-Wimplicit-function-declaration]中无效”。 #includ
我有以下代码: int main(int argc, char *argv[]) { int i, a=9; int length = 0; c
我正在使用 execvp() 运行一些系统调用。程序对于有效命令非常有效,对于任何不存在的命令则失败,这是完美的。该程序是,当我在需要额外参数(如 cat)的命令上使用 execvp() 并且我不提供
用户将读取一行,我将保留第一个单词作为 execvp 的命令。 假设他将输入“cat file.txt” ...命令将为 cat 。但我不知道如何使用这个execvp(),我读了一些教程但仍然没有明白
我正在用 C 编程编写一个正在运行的 shell 脚本。我读过有关 exec 函数的内容,虽然不太了解,但我读过一个像这样使用 execvp 的示例 execvp(*argv, argv) ; /*
这是我的输入函数: int i,j,n,len,c; char *buffer = 0; size_t bufsize = 0; ssize_t characters;
我正在尝试编写一个程序,该程序将 fork ,然后打开一个文件并执行它。它应该执行的文件称为子文件,并且它已经被编译。当我输入 ./child 时,它就会运行。但是,当我运行该程序时,它不会执行子程序
所以我有一个 C 程序,它接受命令输入,但偶尔我似乎会遇到某种内存错误。 我如何读取输入: static void parseLine(char* commandLine, Sequence* seq
我尝试在终端中传递命令行参数“ls -l/user/myuser”并在主目录中执行 execvp。 但不知何故,当我调试代码时,它给了我这个错误。 int main(int argc, char *a
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!