【问题标题】:How to send a variable between two C programs如何在两个 C 程序之间发送变量
【发布时间】:2015-07-16 06:22:12
【问题描述】:

我有一个 C 程序,xyz.c,它对某个变量进行一些计算,比如transferme。我想传输这个变量/将此变量传递给另一个 C 程序,比如jkl.c

我一直在尝试做以下事情:

Fork xyz.c 并使用 execvp() 将此 transferme 传递给 jkl.c 的可执行文件 [原来 execvp 将只接受指向二进制可执行文件或 shell 脚本。]

正在发生的事情是,

  1. execvp() 不传递变量,它需要const char * 作为参数的类型。
  2. 将路径传递给二进制可执行文件不起作用。 [我尝试了一个简单的 fork 和 execvp,没有尝试传递变量。]

有人可以吗:

  1. 告诉我在这种情况下如何使用 execvp()?二进制可执行文件位于主文件夹中,例如路径为/home/user/jkl.o
  2. 告诉我如何将此变量传递给其他程序?

我尝试查看pipe,但我更加困惑。

编辑:我的意思是jkl.out

【问题讨论】:

  • xyz.cjkl.c 不是程序,它们是源文件
  • 只是为了确定,jkl.c 只是另一个源代码文件,还是一个可执行文件?
  • 他们每个人都有main函数吗?
  • transferme是什么类型的变量?大多数类型都可以轻松转换为字符串并返回。
  • @Eregrith 他们都有main函数。

标签: c pipe exec fork argument-passing


【解决方案1】:

您有多种方法可以将数据传输到另一个程序。 (pipin',文件等等。我可以稍后编辑我的答案,并在必要时提供有关在两个 C 程序之间发送数据的更标准指南) 让我们看看execl() 的情况。

我们必须首先同意程序 jkl.o 将由您的主程序启动,并将接收一个包含参数的字符串作为其启动参数。

让我们看看 execl() 的人:

execl()、execlp() 中的 const char *arg 和后续省略号, 和 execle() 函数可以被认为是 arg0, arg1, ..., argn。 它们一起描述了一个或多个指针的列表 以 null 结尾的字符串,表示可用于 执行的程序。按照惯例,第一个论点应该指出 到与正在执行的文件关联的文件名。名单 参数必须由 NULL 指针终止,并且,因为这些是 可变参数函数,此指针必须强制转换 (char *) NULL。

好的。所以你首先必须给 execl() 你的路径,然后,在每一行中都有一个参数。你指出你需要分叉,这是真的。所以让我们这样做,我们分叉,然后我们发送一个包含你的 transferme 的字符串。我将假设这个变量是一个常规字符串。

 child_pid = fork() 
/* fork() == 0 for child process */

   if(child_pid == 0)
   {  
      /*executing  jkl.o */
      execl("/home/user/a.out", "a.out" , transferme);  /* with a.out being your second program, you can change that to whatever you'd want*/
   }
/* parent stuff*/

这应该可以解决问题。


[评论更新:]

我忘了argv[0](即execl的第二个参数必须是程序本身的名字),所以试试

execl("/home/user/d.out", "d.out", transferme, (char*) NULL);

【讨论】:

  • execl 将如何执行没有__start() 的目标文件?
  • @Eregrith 是的,我只是不假思索地 c/c,我现在编辑了第二个程序的答案,感谢您的提醒
  • @Mekap 好的,这样就行了!还有一个问题。我在哪里收到transferme?我在 jkl.c 的 main 中打印了 argv[1],但只打印了“null”。这是我的 execl() 调用:execl("/home/user/d.out", transferme, (char*)NULL);
  • 因为当我没有通过 (char*)NULL 时,我得到了一些 not enough variables to fit a sentinel 错误。 @Mekap
  • @HobbitEesmereldatGoldworthy 你可以让 execvp 工作,你只需要构建“d.out”,将我转移到一个 char 数组中。如果你愿意,你也可以这样做。只要有一个char tab[] = {"d.out", transferme },然后打电话给execvp("/home/user/d.out", tab);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多