寒假里看了苏曙光老师的关于操作系统原理的MOOC课程,其中在第四章里要求使用CreateProcess()函数来打开txt中的写入的若干exe文件。
由于不太清楚CreateProcess()函数的相关用法,上网查询了相关资料,以及前辈的一份代码,但是该代码编译不通过。(用的是gcc),后来自己改进后发现有bug,就是只能对一行进行进程的创建。
在多次调试后发现了fgets()函数会自动吸收最后的回车赋值给buf,导致无法找到,所以只能执行最后一行的exe(没有回车的情况下)。
初代代码:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define LINE 1024
char *ReadData(FILE *fp, char *buf)
{
//在这里将回车赋值给了buf,导致bug。
return fgets(buf, LINE, fp);
//fgets()返回的是fp下一个指针位置。
}
void someprocess(char *buf)
{
printf("%s", buf);//这里的操作你自己定义
}
int main()
{
FILE *fp;
char *buf, filename[25];
printf("input file name:");
gets(filename);
if ((fp=fopen(filename, "r"))==NULL)
{
printf("open file error!!\n");
return 0;
}
buf=(char *)malloc(LINE*sizeof(char));
while(1)
{
//每次调用文件指针fp会自动后移一行
char *p= ReadData(fp, buf);
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
BOOL ret;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = TRUE;
//创建一个进程,可以用它来执行一个程序
ret = CreateProcess(NULL, p, NULL, NULL,
FALSE, CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi);
Sleep(2000);
if(p==NULL)//文件读取结束则跳出循环
break;
someprocess(buf);
}
return 0;
}
后来查询了fgets()函数的用法,以及CreateProcess()函数第二个参数的意义后,发现只要去除buf最后的’\n’即可。
改进后代码:
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LINE 1024
/*
char ReadData(FILE *fp, char *buf)
{
return fgets(buf, LINE, fp);//读取一行到buf
}*/
void someprocess(char *buf)
{
printf("%s\n", buf);//这里的操作你自己定义
}
int main()
{
FILE *fp;
char filename[25];
printf("input file name:");
gets(filename);
if ((fp=fopen(filename, "r"))==NULL)
{
printf("open file error!!\n");
return 0;
}
while(1)
{
char buf[LINE];
char *p = fgets(buf,LINE,fp);
int len = strlen(buf);
if(buf[len-1]=='\n')
buf[len-1] = '\0';
if(p==NULL)//文件读取结束则跳出循环
{
fclose(fp);
break;
}
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
BOOL ret;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = TRUE;
//创建一个进程,可以用它来执行一个程序
ret = CreateProcess(NULL, buf, NULL, NULL,
FALSE, CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi);
Sleep(2000);
someprocess(buf);
}
return 0;
}
运行结果:
如有不足之处,欢迎指出,共同进步,感谢~