【问题标题】:program fails to acquire args in main function程序无法在 main 函数中获取 args
【发布时间】:2026-01-14 00:50:02
【问题描述】:

首先请记住,英语是我的第二语言。因此,首先我为语法/听起来很愚蠢而道歉。然而,这是我在 cs 的大三。我的教授给了我们一个作业,我很难理解它的第一部分。让我从发布我挂断的位置开始:

针对 Linux 平台编写一个名为 assignment4.c 的程序(用 C 语言),其执行类似于 shell 管道。示例:

./assignment4 ls : 排序 = # ls |排序

冒号将 argv 分成左(ls)和右(排序)部分。实现将 fork/exec 并设置一个管道:

父级:左侧部分,以 stdout = pipe write end 运行

child:右侧部分,以 stdin = pipe read end 运行•考虑交换父函数和子函数,为什么?

Where:和是指定要运行的程序的可选参数。

**好的,这只是提供一些背景信息。我在我的程序中尝试对我的主要功能进行编程以能够接受这两个参数。此时只需将它们打印回给我。这是我的 MRE:(请记住这是一个 MRE)。

//################  #-for include
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <dirent.h>
//################


int main(int b, char** locations) {

int ok = 0;
while (locations[ok] != NULL) {
printf("%s \n", locations[ok]);
ok++;
} printf("%s \n", locations[1]);

char * working = "/bin/ls"; // command!
//printf("%s \n", working);
char * arg1 = ""; // ls args
char * arg2 = "/home/yev/Desktop/lab 3"; // directory

//execlp( working, arg1, arg2, NULL);
    return 0;
}

我目前遇到的问题是 sort = # ls |种类。 每当我尝试 ./A3 sort = # ls |排序控制台似乎试图运行排序命令?甚至试图获取论点"sort = # ls | sort" 也打败了我的观点,因为它也不会将该文本字符串输出给我。

请帮忙。再一次让我有时很难理解,这甚至是一个合法的命令吗?简单地运行:"sort = # ls | sort" 在控制台中给出错误:"sort: cannot read: '=': No such file or directory"

这只是我的误解吗?或者是否有原因导致该命令不起作用或为什么我的迷你脚本无法捕获该行并将其打印回给我?教授可能有不同的意思吗?还是我的操作员错误?

【问题讨论】:

  • 使用引号"..."
  • 对“空白空白”使用引号?这对它有用吗?
  • 在我看来这违反了书面说明
  • 我还没有读完你的问题,但是,你的错误似乎是因为 shell 没有将你的参数发送给程序,因为它们恰好是 shell 运算符。在这种情况下,将参数包含在 "..." 中是正确的做法。当然,我可能对您的错误来源有误。
  • @itsMe "violates wirte-up instructions" ,不,但是你通过发送ls : sort = # ls | sort而违反shell规则引号。

标签: c linux ubuntu command


【解决方案1】:

你有几个误解,而不仅仅是一个:

首先,您应该已经收到并正确打印程序的参数,就像您在代码的第一部分中所做的那样:

    int ok = 0;
    while (locations[ok] != NULL) {
        printf("%s \n", locations[ok]);
        ok++;
    }
    printf("%s \n", locations[1]); /* danger here!! */

这段代码将在第一行打印所有程序命令行参数,包括程序名称locations[0],每行一个。然后你打印你的第一个参数(如果你在没有任何参数的情况下调用你的程序,不检查它是否是NULL,小心这个)

在第二部分中,您完全一团糟。首先,您需要知道手册页中ls 的参数是什么。然后你需要了解execlp(2)的参数。 execlp(2) 的第一个参数是您要执行的程序(/bin/ls,虽然您不需要使用程序名称的路径,因为 execlp 已经在 PATH 环境变量中查找要查找的目录ls 命令)第二个、第三个等是程序的参数,但再次包括参数0,这又是ls .你必须在最后加上NULL。你已经将"" 传递为argv[0],所以ls 将不知道它是如何被调用的,它会弄乱应该以它的名字开头的错误消息。 ls 的参数将是 "/home/yev/Desktop/lab 3" 所以你需要在你的系统中有一个名为 /home/yev/Desktop/lab 3 的目录/文件,否则 ls 会报错:

: /home/yev/Desktop/lab 3: No such file or directory.

(通常ls应该写

ls: /home/yev/Desktop/lab 3: No such file or directory.

但由于您已将 "" 作为程序名称传递,它使用该空字符串来声明自己)

你的电话应该是:

    execlp("/bin/ls", "ls", "/home/yev/Desktop/lab 3", NULL);

并且您必须确保您的文件名为lab 3(带有空格),因为shell sh 不是在这里再次分隔其中空格上的字符串。

更多,在你的任务中,你不会被告知你必须处理你的程序命令行参数,你需要为命令sortls创建参数列表(它没有指定什么参数(如果有的话)应该包括在内,但在我看来,你有足够的练习来构建管道,这是你被要求做的)因为你没有包括关于这个主题的任何问题,所以在这件事上没有什么可以回答的.

【讨论】: