Tag: exec

使用execve的新路径运行ls命令

我试图使用execve来运行ls命令。 目前我正在使用以下参数运行它: execve(args[0], args, env_args) //args looks like {“ls”, “-l”, “-a”, NULL} //env_args looks like {“PATH=/bin”, “USER=me”, NULL} 我期望这样做是使用我的新env_args运行ls命令,这意味着它将在我的PATH中查找ls。 但是,这段代码实际上没有做任何事情,当我运行代码时它只返回我的命令提示符而没有输出。 使用相同的args []我使用execvp并且工作并搜索我当前的路径。 你能告诉我我做错了什么吗? 我想要做的是编写我自己的shell程序,在那里我可以创建和导出我自己的环境,并让exec使用我在char **中定义的环境。 本质上我正在编写自己的函数来操作env_args来添加和删除变量,当我调用exec时我希望能够在{“ls”,“ – l”,NULL}上调用exec并让它看不起我的新环境名为ls的有效程序的路径变量。 我希望这能解释我做得更好。 在这种情况下,我不认为extern environ var对我有用。

exec()更改程序映像后malloc的内存会发生什么变化?

我知道当我在Linux中调用其中一个exec()系统调用时,它将使用新映像替换当前正在运行的进程。 因此,当我分叉一个新进程并运行exec() ,子进程将被替换为新进程。 我从堆中分配的内存会发生什么变化? 假设我想解析任意数量的命令并将其发送到exec() 。 为了保持这个任意数字,我可能不得不在某些时候分配内存,因为我认为我不能正确使用静态大小的数组,所以我可能会使用malloc()或类似的东西。 我需要保持这个内存分配,直到我调用exec() ,但exec()永远不会返回。 内存是否被操作系统回收?

将stdout和stderr重定向到套接字以获取分布式shell程序

我制作了一个分布式shell程序,它有一个客户端和服务器。 客户端向服务器发送命令请求,服务器在本地执行该命令,并且应该将该命令的结果输出到客户端。 我无法弄清楚如何将stdout / stderr重定向到客户端。 我使用execvp来执行命令。 我想我可能不得不使用dup2? 但我无法弄清楚如何正确使用它。 有帮助吗?

为什么`execvp`采用`char * const argv `?

我想知道两个exec函数之间是否存在const -ness不同的原因,如果这只是Single Unix Spec中的一个错误: 摘自Linux手册页,它似乎与Single Unix Specification一致 ,这里有两个版本的exec : int execlp(const char * file , const char * arg , …); int execvp(const char * file , char *const argv []); execlp将其参数作为const char * ,它需要两个或多个。 C中的const是一个承诺,函数不会改变指向的数据,在这种情况下是构成字符串的实际字符( char )。 execvp将其参数作为指针数组。 然而,正如你所期望的那样,不是指向const char *的指针数组,而是const关键字位于不同的位置 – 这对C. execvp非常重要,它说它可能会很好地修改字符串中的字符,但是它承诺不修改数组 – 即指向字符串的指针。 所以,换句话说, int fake_execvp(const char *file, char *const argv[]) […]

如何正确使用fork()和exec()

我有这个代码; pid_t process; process = fork(); if (process < 0){ //fork error perror("fork"); exit(EXIT_FAILURE); } if (process == 0){ //i try here the execl execl ("process.c", "process" , n, NULL); } else { wait(NULL); } 我不知道fork()和exec()是否正确。 当我尝试从bash运行程序时,我没有收到任何结果,所以我认为这部分代码可能存在问题。 谢谢。

如何使用fork()和exec()在Mac OS上创建进程

我正在研究一个相对简单,独立的“ 流程启动器 ”,我希望能够在Windows(XP,Vista,7),Linux(Ubuntu 10.10)以及特别是Mac OS X (10.6)上工作。 Linux和Windows基本上都可以工作,但我在使用Mac版时遇到了一些麻烦。 我希望fork()和exec()函数在Mac OS下可以像在Linux中一样工作。 所以我的第一个问题是: 我应该使用它们在Mac上创建进程还是要使用任何特定于平台的function? 我目前的代码(在Linux下工作正常)来调试它看起来像这样: pid_t processId = 0; if (processId = fork()) == 0) { const char * tmpApplication = “/Path/to/TestApplication”; int argc = 1; char * argv[argc + 1]; argv[0] = tmpApplication; argv[1] = NULL; execv(tmpApplication, argv); }else { //[…] } 不知道这是否可以在Mac OS X下运行,因为我的子进程根本没有启动,而没有出现错误。 谢谢!

C中的这个多管道代码是否有意义?

几天我就提出了一个问题 。 我的解决方案符合接受的答案中的建议。 但是,我的一个朋友提出了以下解决方案: 请注意,代码已更新几次(查看编辑修订版)以反映下面答案中的建议。 如果您打算给出新的答案,请考虑这个新代码,而不是那些有很多问题的旧代码。 #include #include #include #include int main(int argc, char *argv[]){ int fd[2], i, aux, std0, std1; do { std0 = dup(0); // backup stdin std1 = dup(1); // backup stdout // let’s pretend I’m reading commands here in a shell prompt READ_COMMAND_FROM_PROMPT(); for(i=1; i 1) { dup2(aux, 0); close(aux); } […]

调用execvp()内部的重定向无法正常工作

我一直在实现一个使用execvp()执行给定命令的小程序。 不使用重定向时它工作正常,但是当我运行如下命令时: cat file1.txt > redirected.txt cat输出以下错误消息并失败: cat: >: No such file or directory cat: redirected.txt: No such file or directory 我已经做了一些挖掘,我开始认为也许execvp()不允许进行重定向,因为它不在shell中运行。 这是否意味着我必须在重定向发生时手动选择并在fork / exec代码中使用管道来解决这个限制? 有没有比使用execvp()更好的方法? 谢谢!

如何退出子进程并从execvp()返回其状态?

在我简单的自定义shell中,我正在从标准输入中读取命令并使用execvp()执行它们。 在此之前,我创建了当前进程的fork,我在该子进程中调用了execvp(),之后,我调用exit(0)。 像这样的东西: pid = fork(); if(pid == -1) { perror(“fork”); exit(1); } if(pid == 0) { // CHILD PROCESS CODE GOES HERE… execvp(pArgs[0], pArgs); exit(0); } else { // PARENT PROCESS CODE GOES HERE… } 现在,使用execvp()运行的命令可以返回错误吗? 我想正确地处理它,现在,我总是调用exit(0),这意味着子进程将始终具有“OK”状态。 如何从execvp()调用返回正确的状态并将其放入exit()调用? 我应该只获取execvp()返回的int值并将其作为exit()参数而不是0传递。这是否足够正确?

如何正确使用fork,exec,等待

我写的shell需要执行用户给它的程序。 这是我的程序的缩短版本 int main() { pid_t pid = getpid(); // this is the parents pid char *user_input = NULL; size_t line_sz = 0; ssize_t line_ct = 0; line_ct = getline(&user_input, &line_sz, stdin); //so get user input, store in user_input for (;;) { pid_t child_pid = fork(); //fork a duplicate process pid_t child_ppid = getppid(); //get […]