我有一个文件hello.exe
文件路径是D:\test\hello.exe
这是一个简单的hello world程序(测试好了)。
我有另一个程序proc.c
文件路径为D:\test\proc.c
,代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<process.h>
#include<errno.h>
#include<string.h>
main(int argc,char *argv[])
{
int ret;
ret=execl("D:\\test\\hello.exe","D:\\test\\hello.exe");
if(ret==-1)
printf("%d:\t%s",ret,errno);
}
程序挂起(窗口对话框显示The program has stopped working
)!!!
我甚至尝试D:/test/hello.exe
作为execl()
的参数,但同样...... {/ p>
我哪里错了? 请有人给我正确的语法吗?请使用windows下的MinGW使用process.h的各种功能提供示例代码。 Web教程链接也是可以接受的。
非常感谢你
答案 0 :(得分:3)
您必须包含一个库,
#include<unistd.h>
因为它是在这个库中定义的所以如果你不包含它,你将得到AN错误。 并更正你的代码,因为你写的“exec”不是execl。
int main()
{
execl("D:/test/hello","D:/test/hello",0);
return 0;
}
答案 1 :(得分:0)
如果您使用警告编译,您会注意到errno
是int
,但您尝试将其与printf
一起用作字符串,这意味着它正在用作指针。内存地址0xFFFFFFF2(或errno
的十六进制值)可能无效。
除此之外,您需要使用execl
指针结束NULL
调用。否则,该函数将继续认为它有更多的命令行参数,所有这些都是字符串,直到它在内存中找到的第一个NULL
或直到第一个无效的内存访问,以先到者为准。因为复制字符串涉及取消引用指针,它将读取由未知字节组成的地址,并尝试重复取消引用该地址处的指针。如果指针无法解除引用,意味着无法访问从中读取数据的地址,则会导致程序崩溃。
将来请用-Wall编译。