在execvp中不运行同一命令两次或两次以上
我使用execvp执行一些命令,如ls-l、who、cp-r./aaa./bbb等。在我第二次尝试执行相同的命令之前,一切都正常。例如,我将向您展示我使用的顺序:ls-l一切正常,谁一切正常,ls-lbad地址。这是我的代码:在execvp中不运行同一命令两次或两次以上,c,execvp,C,Execvp,我使用execvp执行一些命令,如ls-l、who、cp-r./aaa./bbb等。在我第二次尝试执行相同的命令之前,一切都正常。例如,我将向您展示我使用的顺序:ls-l一切正常,谁一切正常,ls-lbad地址。这是我的代码: if(strcmp(com_instr, "issuejob") == 0) { pid = fork(); if(pid < 0) { perror("Fork");
if(strcmp(com_instr, "issuejob") == 0)
{
pid = fork();
if(pid < 0)
{
perror("Fork");
exit(1);
}
else if(pid == 0)
{
sleep(0.1);
//number of args
read(fd, &t_args, sizeof(int));
printf("t_args %d\n",t_args);
commands = malloc(t_args*sizeof(char *));
for(i=0; i<t_args; i++)
{
commands[i] = malloc(SIZE*sizeof(char));
}
for(i=0; i<t_args; i++)
{
read(fd, commands[i], SIZE);
}
//Receiving data from named-pipe
/*temp_run = run_node->next;
while(temp_run != NULL)
{
printf("jjjjjjjjjjjjjjjjjjjj %d",temp_run->job_id);
temp_run = temp_run->next;
}*/
printf("command %s\n", commands[0]);
execvp(commands[0], commands);
perror("execvp");
exit(1);
}
else if(pid > 0)
{
temp_run = run_node;
for(i=0; i<run_num; i++)
{
if(temp_run->next != NULL) temp_run = temp_run->next;
else break;
}
if((i <= run_num-1) && (wait_node->next == NULL))
{
temp_run->next = malloc(sizeof(run_list));
temp_run = temp_run->next;
saving_data_run(temp_run, j_id, line, 1, arg_num-1, pid);
printf("pid:%d\n",temp_run->pid);
++running;
send_data_for_exec(line, arg_num-1, fd);
}
else
{
temp_wait = wait_node;
while(temp_wait->next != NULL) temp_wait = temp_wait->next;
temp_wait->next = malloc(sizeof(wait_list));
saving_data_wait(temp_wait, j_id, line, 0, arg_num-1, pid);
wait_num++;
}
}
j_id++;
}
我使用命名管道在char**命令中传递参数。Args正确地传递给char**命令,我已经用printf检查过了。在execvp中多次执行同一命令是否有问题?提前谢谢 我担心您使用:
for(i=0; i<t_args; i++)
{
read(fd, commands[i], SIZE);
}
每次调用read时,它总是从文件或管道中读取大小字节。这可能是因为您的文件构造正确,但我想知道您是否在这些读取命令中意外引入了太多数据
例如,如果文件/管道中填充了以下内容:
2,‘l’、‘s’、‘l’、‘l’、‘0’、‘1’、‘c’、‘d’、‘0’、‘2’、‘l’、‘s’、‘l’、‘0’
大小被定义为80,然后在第一次调用时将2读入t_参数,但第一次读取可能会将其余数据消耗到命令[0]中。第二次读取命令[1]
里面没有数据
从您的描述中不清楚您的数据是什么样子的。。。在每次读取调用之后,最好在循环中逐字节打印它,以及read的返回值。通常,read将返回实际读取的字节数。。。你可以用它来帮助理智检查你的答案
希望有帮助,
-J.我假设您首先分叉,因为execvp用新程序替换调用过程?问题可能与叉子有关。如果你能提供一个完整的,最简单的例子来说明问题的话,这会让我们更容易。是的,我使用fork。我将尝试编辑它。请提供一个。通过运行程序并查看程序崩溃的地方,通常比盯着代码更容易发现问题。