执行命令行并等待完成

function TDMDb.WaitExeFinish(const sCmdName: string):boolean;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  b:boolean;
begin
  // 初始化
  FillChar(StartupInfo, SizeOf(StartupInfo), 0);
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_HIDE; // 隐藏执行


  // 执行命令行
  b:=CreateProcess(nil, PWideChar(sCmdName), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);


  // 等待执行完成
  with ProcessInfo do
  begin
    CloseHandle(hThread);
    WaitForSingleObject(hProcess, INFINITE);
    CloseHandle(hProcess);
  end;


  // 返回
  Result := b;
end;
在 Linux 下使用 C 语言调用命令等待其运结束,最常用的方法是使用 `system()` 函数或结合 `fork()` 与 `exec()` 系列函数配合 `wait()` 或 `waitpid()`。其中 `system()` 是最简单的方式,它会启动一个 shell 来执行命令自动等待命令执行完成。 ### 方法一:使用 `system()` ```c #include <stdio.h> #include <stdlib.h> int main() { int ret; printf("开始执行命令...\n"); // 调用命令命令(例如列出当前目录) ret = system("ls -l"); if (ret == -1) { perror("system 调用失败"); } else { printf("命令执行完毕,返回值: %d\n", ret); } return 0; } ``` > ✅ 优点:简单直接 > ❌ 缺点:安全性较低(容易受 shell 注入影响),且无法精确控制进程为 --- ### 方法二:使用 `fork()` + `execlp()` + `waitpid()` 更精细地控制子进程的创建和等待: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid; int status; printf("创建子进程执行命令...\n"); pid = fork(); if (pid < 0) { perror("fork 失败"); exit(1); } else if (pid == 0) { // 子进程 execlp("ls", "ls", "-l", NULL); // 执 ls -l perror("execlp 执失败"); // 如果 exec 成功,这不会执 exit(1); } else { // 父进程等待子进程结束 waitpid(pid, &status, 0); if (WIFEXITED(status)) { printf("子进程正常退出,返回值: %d\n", WEXITSTATUS(status)); } else { printf("子进程异常终止\n"); } } return 0; } ``` > ✅ 优点:更安全、可控性强,可获取详细退出状态 > ❌ 缺点:代码稍复杂 --- ### 总结 - 若只是简单调用命令等待结束,推荐使用 `system()`。 - 若需要更高安全性或更复杂的交互(如重定向、超时等),应使用 `fork()` + `exec()` + `waitpid()`。 编译运示例: ```bash gcc run_command.c -o run_command ./run_command ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敦格

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值