【发布时间】:2015-10-19 23:22:44
【问题描述】:
我正在尝试让程序启动一个单独的进程,该进程只是在 linux 中以长格式列出文件。 (换句话说,我试图让我的程序执行“ls -al”)。我遇到的问题是编译器不断警告我这条消息:warning: passing argument 2 of 'run' from incompatible pointer type
我该如何解决这个问题?
#include <sys/types.h>
#include <sys/stat.h>
#include <wait.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
void run(char *app,char* param[250]){
if (fork()==0){
execvp(app,param);
}else{
wait(NULL);
}
}
int main(){
printf("Running ls -al...\n");
char param[10][250];
strcpy(param[0],"ls");
strcpy(param[1],"-al");
param[2][0]='\0';
run("/usr/bin/ls",param);
printf("\n");
return 0;
}
【问题讨论】:
-
这个表达式:
param[2][0]='\0';不正确。参数列表中的最后一个条目是char *到 NULL,不是单个 0x00 字节,而是一个 'pointer 大小(在 32 位架构上为 4 个字节)数组,所有 0x00 I.E.参数指针列表中的最后一个条目需要是“0x00000000”(对于 32 位架构)指向地址 0 的指针 -
请阅读
fork()的手册页。 fork() 可以返回 3 种不同的东西。 1) =0 然后子进程运行。 2) >0 表示父进程正在运行(子进程成功启动) 3) errno 系统变量表示子进程启动失败的原因。发布的代码(不一定有效)假设子进程的启动是成功的。 -
对
execvp()的调用可能会失败。如果失败,则控制权返回到调用execvp()之后的下一条语句,这应该是调用perror(),然后调用exit() -
总的来说,如果 fork() 失败或 execvp() 失败,那么代码将执行
wait(),可能永远等待子事件,这永远不会发生。换句话说,始终检查调用系统函数的返回值,以确保它们成功 -
我已经阅读了 fork 的手册。当我正在处理代码时,有时我可以让程序运行但参数没有被传入。我知道问题出在我的字符串数组(多索引字符数组)上,但我不知道如何使函数以 execvp 期望的格式接收数据
标签: c arrays string function size