gpt4 book ai didi

c - 从 C 程序中使用 $EDITOR 变量打开文件进行编辑

转载 作者:行者123 更新时间:2023-11-30 15:46:05 24 4
gpt4 key购买 nike

我正在编写一个 C 程序,我想打开一个带有 $EDITOR 变量的文件来对其进行更改。

假设我已经检查了 $EDITOR 是否未设置,并且缺少的部分是打开文件进行编辑,那么 execl() 是最佳选择还是我应该使用不同的函数吗?

我在 Arch Linux 下工作。

最佳答案

只要您相当确定您处于单线程程序中,您就可以将标准输入和标准输出(可能还有标准错误)发送到终端,并且您不会因信号处理而感到不安 system() 强加于您,您可以使用system()通过 shell 执行命令。

如果您不想信任system() ,然后 exec*() 之一函数系列(加上 fork() )将满足您的需要。您仍然需要对标准 I/O channel 有相当的把握——一些编辑器对随机文件或管道输入 react 不佳。您可以选择要使用的信号处理方式以及安装方式。您可以处理任何线程安全问题。这是一个适度的工作量。

您可能需要仔细考虑是否向用户提供要编辑的“真实”文件或其副本。您的代码可能应该识别编辑器是否成功退出(如果没有成功退出,则可能应该忽略输出文件)。您可能还想检查文件的新版本大小是否合理(例如,不是零字节 - 但也许这并不重要;这取决于上下文)。如果正在编辑的文件是珍贵的配置文件,您会担心这一点;如果是重新执行以前的一些命令(历史机制),您就不用担心其中的一些细节。

<小时/>

这是我的程序中的历史“编辑”命令。它允许用户指定要复制到文件中的一系列命令,然后编辑该文件,然后执行结果(可能为空)。这是逐字代码。大多数函数调用都是针对特定于程序的函数,但大多数名称应该是可解释的(我认为)。 ctxt_*()函数系列处理“上下文”,即程序的当前设置。它可以使用比您需要的更多的环境变量。 sql_file()函数在当前上下文中执行输入文件中的命令 - 此代码创建一个新的上下文来运行命令。

/* Edit history command(s) */
static void do_edit(char *s)
{
FILE *fp;
long c1;
long c2;
char tmpfname[BUFSIZ];
char sys[BUFSIZ];
const char *editor;

if (ctxt_gethistory() != OP_ON)
{
cmd_warning(E_HISTORYOFF, "");
return;
}

s = skipblanks(s);
c1 = c2 = 0;
if (sscanf(s, "%ld%ld", &c1, &c2) != 2)
c2 = c1;

if ((fp = fopen_namedtmpfile(tmpfname, sizeof(tmpfname))) == 0)
{
cmd_warning(E_FAILCREATETMPFILE, "");
return;
}

hist_output(fp, c1, c2, H_COMMAND);
fclose(fp);

if ((editor = getenv("DBEDIT")) == NIL(char *) &&
(editor = getenv("VISUAL")) == NIL(char *) &&
(editor = getenv("EDITOR")) == NIL(char *))
editor = DEF_EDITOR;
esnprintf(sys, sizeof(sys), "%s %s", editor, tmpfname);
system(sys);

fp = fopen(tmpfname, "r");
unlink(tmpfname);
if (fp == 0)
{
cmd_warning(E_FAILREOPENTMPFILE, tmpfname);
}
else
{
/* Copy file to history log */
if ((c1 = hist_input(fp)) > 0)
cmd_set_promptnum(c1);
fseek(fp, 0L, SEEK_SET);
ctxt_newcontext();
ctxt_newinput(fp, "<<temp>>");
ctxt_sethistory(op_off);
sql_file();
ctxt_endcontext();
}
}

关于c - 从 C 程序中使用 $EDITOR 变量打开文件进行编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18624911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com