1

我有以下c代码。我想通过调用来显示我的文件,execv() 但是以下似乎永远不会起作用。程序终止并注意弹出。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(void){
  int pid; 
  if(pid=fork()>0){
      //read in from stdin and pass to pipe
   }else if(pid==0){
      //read from pipe
      //write to out.txt
      //everything up to here works fine

      char* para[]={"less","/Desktop/out.txt"};
      execv("/bin/less",para);
   }
   return 0;
}
4

2 回答 2

1

(包含原始代码execv("bin/less", para);。)除非当前目录是根目录/,或者除非less子目录中有程序,否则./bin/less您的问题之一是可执行文件名称中可能存在拼写错误。假设程序是/bin/less而不是/usr/bin/less。您甚至可以使用execvp()对程序进行基于路径的搜索。

还有一个额外的问题:您需要包含一个空指针来标记参数列表的结尾。

execv()最后,您可以在返回后打印错误消息。它返回的事实告诉你它失败了。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(void)
{
    int pid;
    if ((pid = fork()) != 0)
    {
        // read in from stdin and pass to pipe
        // Need to test for fork() error here too
    }
    else
    {
        // read from pipe
        // write to out.txt
        // everything up to here works fine

        char *para[] = { "/bin/less", "Desktop/out.txt", 0 };
        execv(para[0], para);
        fprintf(stderr, "Failed to execute %s\n", para[0]);
        exit(1);
    }
    return 0;
}

或者:

        char *para[] = { "less", "Desktop/out.txt", 0 };
        execvp(para[0], para);
        fprintf(stderr, "Failed to execute %s\n", para[0]);

代码中关于管道的注释令人费解,因为除了注释之外没有任何管道的迹象。就目前而言,less将读取它被告知要读取的文件。请注意,less如果输出不进入终端,则不会对其输出进行分页。由于我们看不到 I/O 重定向,因此我们必须假设这less将忽略程序尝试写入的任何内容,并且不会将任何数据发送回程序。

于 2012-05-26T06:03:14.083 回答
1
char* para[]={"less","/Desktop/out.txt"};
execv("/bin/less",para);

execv 如何知道何时停止读取参数?

我想如果你把代码放在那里来处理 execv() 返回一个错误,你就会发现这个。您也没有测试来自 fork() 的错误。

于 2012-05-26T06:04:22.043 回答