标签: execvp

控制是否在"execvp()"之后返回?


if(pid == 0)
{
      execvp(cmd, args);
      // printf("hello"); // apparently, putting this or not does not work.
      _exit(-1);
}
else
{
      // parent process work
}
Run Code Online (Sandbox Code Playgroud)

"execvp()"将当前程序替换为要执行的程序(当然在相同的进程上下文中).因此,在execvp()之后设置任何printf()调用都不起作用.这就是文档所说的,我也验证了它.

但是,为什么_exit()需要..?在execvp()之后,控件是否会返回语句?

我会感激任何指针.

谢谢

c exit execvp

6
推荐指数
1
解决办法
6939
查看次数

如何防止子分叉进程继承CPU亲和力?

我有一个服务器进程,它会分叉许多子进程.服务器进程与CPU核心具有亲缘关系,但我不希望子进程继承该亲和性(而OS应该处理运行这些进程的位置).有没有办法将父子进程与cpu亲和关系脱钩?

c++ linux fork affinity execvp

6
推荐指数
1
解决办法
2270
查看次数

从已执行的应用程序获取stdout

有没有人知道如何捕获输出(我认为它的标准输出)execvp而不是系统在终端中打印它(在Linux上的c)?

c linux stdout execvp

6
推荐指数
1
解决办法
5018
查看次数

处理execvp的参数数组?

当我调用时execvp,例如execvp(echo, b),其中b是命令a的参数数组,稍后更改此数组会影响先前执行的execvp调用吗?当我尝试调用execp(echo,b)时,它最终打印出来(null)而不是b中的内容.任何人都可以指出为什么以及我必须做什么才能正确传递参数?

c exec execvp

6
推荐指数
1
解决办法
3万
查看次数

构建一个C shell.execvp返回'No such file'错误.使用malloc即时创建argv数组

我正在构建一个shell,并且在系统调用'execvp'时遇到了一些问题.我在这个主题上看到了一些其他的问题,但它们含糊不清,似乎没有完全解决(谁问过这些问题并没有提供太多信息而且得不到好的答案).

显然我有自己的命令行,我正在读取stdin的用户输入

mysh some/path $ ps -a 
Run Code Online (Sandbox Code Playgroud)

我正在构建一个args数组作为char**并且数组本身可以工作(我认为),因为当我打印出我的函数中的值时,它显示

args[0] = 'ps'
args[1] = '-a'
args[2] = '(null)'
Run Code Online (Sandbox Code Playgroud)

所以,我在我的进程中调用fork和execvp(cmnd,args),其中cmnd是"ps",args如上所述,perror等.

我明白了

'Error: no such file or directory.'  
Run Code Online (Sandbox Code Playgroud)

我需要输入$ PATH变量吗?我还在做别的什么吗?

这是我生成args数组的代码:

char ** get_args(char * cmnd) {
int index = 0;
char **args = (char **)emalloc(sizeof(char *));
char * copy = (char *) emalloc(sizeof(char)*(strlen(cmnd)));
strncpy(copy,cmnd,strlen(cmnd));
char * tok = strtok(copy," ");
while(tok != NULL) {
    args[index] = (char *) emalloc(sizeof(char)*(strlen(tok)+1));
    strncpy(args[index],tok,strlen(tok)+1);
    index++;
    tok = strtok(NULL," ");
    args = (char**) erealloc(args,sizeof(char*)*(index+1));
}
args[index] = …
Run Code Online (Sandbox Code Playgroud)

c malloc shell process execvp

5
推荐指数
1
解决办法
1685
查看次数

execvp和参数类型-ANSI C

我在使用时遇到了麻烦execvp()execvp()期望将char * const *类型作为第二个参数。我想解析传递给应用程序的参数(在中argv)并制作该类型的数组。例如,用户正在调用二进制文件,如下所示:

./myapp "ls -a -l"
Run Code Online (Sandbox Code Playgroud)

然后我从中制作以下数组:

{"ls", "-a", "-l", NULL}
Run Code Online (Sandbox Code Playgroud)

现在,我的代码如下所示:

    const char* p[10];
    char temp[255] = "ls -a -l";

    p[0] = strtok(temp, " ");
    for(i=0; i<9; i++) {
        if( p[i] != NULL ) {
            p[i+1] = strtok(NULL, " ");
        } else {
            break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

它有效,但是我得到警告:

main.c:47: warning: passing argument 2 of ‘execvp’ from incompatible pointer type /usr/include/unistd.h:573: note: expected ‘char * const*’ but argument is of type …

c strtok execvp argv

5
推荐指数
1
解决办法
4010
查看次数

execvp/fork - 如何捕获不成功的执行?

现在我正在编写一个必须执行子进程的C程序.我没有同时或任何事情做多个子进程,所以这是相当简单的.我肯定会成功执行内置shell程序(例如cat和echo之类的东西),但我还需要能够告诉其中一个程序何时无法成功执行.我正在尝试使用以下简化代码:

int returnStatus; // The return status of the child process.
pid_t pid = fork();

if (pid == -1) // error with forking.
{
   // Not really important for this question.
}
else if (pid == 0) // We're in the child process.
{
   execvp(programName, programNameAndCommandsArray); // vars declared above fork().

   // If this code executes the execution has failed.
   exit(127); // This exit code was taken from a exec tutorial -- why 127?
}
else // We're in the …
Run Code Online (Sandbox Code Playgroud)

c fork exec execvp

5
推荐指数
1
解决办法
6098
查看次数

fork/exec/waitpid问题

我试图通过检查waitpid()的结果来确定执行是否失败.但是,即使我运行一个我知道失败的命令并将问题写入stderr,下面的检查也从未注册.这段代码可能有什么问题?

谢谢你的帮助.

pid_t pid;  // the child process that the execution runs inside of.
int ret;      // exit status of child process.

child = fork();

if (pid == -1)
{
   // issue with forking
}
else if (pid == 0)
{
   execvp(thingToRun, ThingToRunArray); // thingToRun is the program name, ThingToRunArray is
                                        //    programName + input params to it + NULL.

   exit(-1);
}
else // We're in the parent process.
{
   if (waitpid(pid, &ret, 0) == -1)
   {
      // Log an …
Run Code Online (Sandbox Code Playgroud)

c fork exec waitpid execvp

5
推荐指数
1
解决办法
8774
查看次数

从`forkpty`子进程读取:`ls /`输出产生`EIO`

我试图使用forkptyexecvp一个ls /,然后从父进程读取它的输出和写入到stdout.

我得到了它的工作,并在Valgrind下运行它也没有显示任何错误.

编辑:Valgrind没有显示内存错误.Valgrind下的最后一个read收益率EIO.

但是,最后一个read总是返回-1并设置errnoEIO.我一直在研究和阅读手册页,但我仍然不明白为什么会发生这种情况:

  EIO    I/O  error.  This will happen for example when the process is in
         a background process group, tries to read from  its  controlling
         terminal,  and  either it is ignoring or blocking SIGTTIN or its
         process group is orphaned.  It may also occur when  there  is  a
         low-level I/O error while reading from a disk or tape.
Run Code Online (Sandbox Code Playgroud)

我还注意到,如果我捕获 …

c ipc pty execvp

5
推荐指数
1
解决办法
434
查看次数

在C++中使用execvp的最佳实践

一开始,我写了这样的东西

char* argv[] = { "ls", "-al", ..., (char*)NULL };
execvp("ls", argv);
Run Code Online (Sandbox Code Playgroud)

但是,GCC突然出现了这个警告:"C++禁止将字符串常量转换为char*."

然后,我将代码更改为

const char* argv[] = { "ls", "-al", ..., (char*)NULL };
execvp("ls", argv);
Run Code Online (Sandbox Code Playgroud)

结果,GCC弹出了这个错误,"无效转换const char**char* const*."

然后,我将代码更改为

const char* argv[] = { "ls", "-al", ..., (char*)NULL };
execvp("ls", (char* const*)argv);
Run Code Online (Sandbox Code Playgroud)

它最终工作,编译没有任何警告和错误,但我认为这有点麻烦,我找不到有人在互联网上写这样的东西.

有没有更好的方法execvp在C++中使用?

c++ execvp

5
推荐指数
1
解决办法
3242
查看次数

标签 统计

execvp ×10

c ×8

exec ×3

fork ×3

c++ ×2

linux ×2

affinity ×1

argv ×1

exit ×1

ipc ×1

malloc ×1

process ×1

pty ×1

shell ×1

stdout ×1

strtok ×1

waitpid ×1