用C执行txt中的.exe文件 MOOC 苏曙光 操作系统原理 实验

寒假里看了苏曙光老师的关于操作系统原理的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;
}

运行结果:
在这里插入图片描述
发现运行成功

如有不足之处,欢迎指出,共同进步,感谢~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值