让我首先说明我不是来自C
背景.我是一名PHP开发人员.所以我到目前为止所编写的所有内容都是通过从其他示例中获取一些零碎的东西并对其进行微调以满足我的要求.所以,如果我提出过于基本或明显的问题,请耐心等待.
我开始FFmpeg
使用CreateProcess()
了
int startFFmpeg()
{
snprintf(cmd, sizeof(cmd), "D:\\ffpmeg\bin\ffmpeg.exe -i D:\\video.mpg -r 10 D:\\frames");
PROCESS_INFORMATION pi;
STARTUPINFO si={sizeof(si)};
si.cb = sizeof(STARTUPINFO);
int ff = CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
return ff;
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是获取该PID
过程,然后稍后检查一段时间后它是否仍在运行.这基本上就是我要找的东西:
int main()
{
int ff = startFFmpeg();
if(ff)
{
// great! FFmpeg is generating frames
// then some time later
if(<check if ffmpeg is still running, probably by checking the PID in task manager>) // …
Run Code Online (Sandbox Code Playgroud) 我不明白为什么Unix有fork()
创建新流程的原因.在Win32 API中,我们CreateProcess()
创建了一个新进程并将可执行文件加载到其地址空间中,然后从入口点开始执行.但是Unix提供了用于创建新进程的fork,如果我想运行另一个进程,我不知道为什么要复制我的进程.
那么让我问这两个问题:
fork()
然后exec()
是更有效的,为什么没有一个功能forkexec(const char *newProc)
,因为我们将调用exec()
之后fork()
,几乎在所有情况下?fork()
存在呢?我正在使用CreateProcess()从我的GUI应用程序在Windows中运行外部控制台应用程序.我想以某种方式收集输出,以了解是否有错误.现在我知道我必须用hStdOutput做一些事情,但我不明白是什么.我是c ++和没有经验的程序员的新手,我实际上不知道如何处理句柄或如何点亮管道.
如何将输出转换为某种变量(或文件)?
这就是我现在所拥有的:
void email::run(string path,string cmd){
WCHAR * ppath=new(nothrow) WCHAR[path.length()*2];
memset(ppath,' ',path.length()*2);
WCHAR * pcmd= new(nothrow) WCHAR[cmd.length()*2];
memset(pcmd,' ',cmd.length()*2);
string tempstr;
ToWCHAR(path,ppath); //creates WCHAR from my std::string
ToWCHAR(cmd,pcmd);
STARTUPINFO info={sizeof(info)};
info.dwFlags = STARTF_USESHOWWINDOW; //hide process
PROCESS_INFORMATION processInfo;
if (CreateProcess(ppath,pcmd, NULL, NULL, FALSE, 0, NULL, NULL, &info, &processInfo))
{
::WaitForSingleObject(processInfo.hProcess, INFINITE);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
}
delete[](ppath);
delete[](pcmd);
}
Run Code Online (Sandbox Code Playgroud)
这段代码可能让任何体面的程序员尖叫,但(我甚至不应该说:)它的工作原理;-)
问题:如何使用hStdOutput读取文件的输出(例如)?
从Android Studio构建应用程序时,我得到以下异常
CreateProcess error = 206,文件名或扩展名太长了
我曾尝试在Windows注册表中启用更长的路径,但仍面临此问题.请帮忙!
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesWithDesugarForDebug'. com.android.build.api.transform.TransformException: org.gradle.process.internal.ExecException: A problem occurred starting process 'command 'C:\jdk1.8.0_171\bin\java.exe''
* Try:
Run with --debug option to get more log output. Run with --scan to get full insights.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithDesugarForDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) …
Run Code Online (Sandbox Code Playgroud) 在我的程序中,我有以下代码:
//Code
if not CreateProcess(nil, NonConstCmd, nil, nil, True, NORMAL_PRIORITY_CLASS or
CREATE_NEW_PROCESS_GROUP, nil, PCh, SI, P) then
//Code
Run Code Online (Sandbox Code Playgroud)
并且我一直收到访问冲突错误.顺便说一下,在Delphi7中,相同的代码完美地运行.我读过MSDN,发现Delphi中的CreateProcess函数可以修改第二个参数.初始它是const,这就是为什么我创建一个具有相同值的新变量.但它没有任何效果.
问题是:为什么这段代码不起作用?
两者之间的主要区别是什么?我愿意从我的(C++)应用程序中只运行另一个EXE.继承环境,安全功能等时是否有任何差异?
我在linux平台上开发.
我想在我的库中创建一个新进程而不替换当前正在执行的图像.
因为我正在开发一个库,所以我没有主要功能.
我想在调用程序应用程序关闭后继续新进程(就像CreateProcess Windows API一样).
是否可以在Linux中使用?
像这样的功能:
void Linux_CreateProcess(const char* app_name)
{
// Executing app_name.
// ???????? what is the code ??????
// app_name is running and never close if current application close.
return;
}
Run Code Online (Sandbox Code Playgroud)
注意:
system()阻止当前进程,这并不好.我想继续当前的流程.
exec()系列替换当前正在执行的图像,这并不好.
如果当前进程关闭,popen()将关闭新进程.
我正在尝试使用CreateProcess启动新的环境块并在新的环境块中运行批处理文件.我已经阅读了CreateProcess的msdn示例,并提出了如下所示的代码.
发生了什么,它会打开新的命令提示符,然后停在那里.由于某种原因,它不会运行我的.bat文件.使用system("CALL path")将调用.bat文件.
#include <iostream>
#define WINDOWS_LEAN_AND_MEAN
#include <Windows.h>
#include <strsafe.h>
#define BUFSIZE 4096
int main()
{
//system("CALL C:\\HFSS\\setup_vars.bat");
//return 0;
LPWCH chNewEnv;
LPTSTR lpszCurrentVariable;
DWORD dwFlags = 0;
TCHAR szAppName[] = TEXT("C:\\windows\\system32\\cmd.exe");
TCHAR cmdArgs[] = TEXT("C:\\HFSS\\setup_var.bat");
STARTUPINFO si;
PROCESS_INFORMATION pi;
BOOL fSuccess;
// Copy environment strings into an environment block.
chNewEnv = GetEnvironmentStrings();
lpszCurrentVariable = (LPTSTR)chNewEnv;
if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MySetting=A"))))
{
printf("String copy failed\n");
return FALSE;
}
lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
if (FAILED(StringCchCopy(lpszCurrentVariable, BUFSIZE, TEXT("MyVersion=2"))))
{
printf("String copy …
Run Code Online (Sandbox Code Playgroud) 我有2个应用程序,program.exe和updater.exe,都是用Delphi5编写的.程序在没有admin-rights(并且没有manifest)的情况下运行,updater有一个带有"requireAdministrator"的清单,因为他必须能够在Program-Folder中写入以更新program.exe.
问题是启动更新程序,让他等到程序关闭.我在网上找到了不同的方式,但都没有用(大多数情况下,第一个应用程序启动第二个应用程序并等待第二个应用程序的结束,在我的情况下,第二个应用程序应该等待第一个应用程序的结束).
更新程序应该等待,这很容易
updater.exe
{$R manifest.res}
label.caption:='Wait for program.exe closing';
repeat
sleep(1000);
until File is not open
ProgramHandle := Read Handle from File
WaitForSingleObject(ProgramHandle,INFINITE);
label.caption:='program.exe CLOSED';
Do updates
Run Code Online (Sandbox Code Playgroud)
方法1
使用CreateProcess启动更新程序:
program.exe
FillChar(siInfo, SizeOf(siInfo), 0);
siInfo.cb := SizeOf(siInfo);
saProcessAttributes.nLength := SizeOf(saProcessAttributes);
saProcessAttributes.lpSecurityDescriptor := nil;
saProcessAttributes.bInheritHandle := TRUE;
saThreadAttributes.nLength := SizeOf(saThreadAttributes);
saThreadAttributes.lpSecurityDescriptor := nil;
saThreadAttributes.bInheritHandle := True;
if CreateProcess(nil,
PChar('updater.exe'),
@saProcessAttributes,
@saThreadAttributes,
TRUE, NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Application.ExeName)),
siInfo, piInfo) then
begin
DuplicateHandle(GetCurrentProcess, GetCurrentProcess,
piInfo.hProcess, @MyHandle,
PROCESS_QUERY_INFORMATION, TRUE,
DUPLICATE_SAME_ACCESS) then
Write MyHandle in a …
Run Code Online (Sandbox Code Playgroud) delphi createprocess handle waitforsingleobject shellexecuteex
我想创建一个与父进程分离的子进程,这样如果父进程退出,子进程将继续。我正在 Windows 上工作并执行了以下操作:
if(CreateProcess(program, arguments, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW | DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo))
{
CloseHandle(pinfo.hProcess);
CloseHandle(pinfo.hThread);
}
Run Code Online (Sandbox Code Playgroud)
在我的例子中,父进程继续运行,而子进程在后台执行。如果我在终端中按 Ctrl-C 来终止父进程,则子进程将按预期继续执行。但是,如果我在 Window 的任务管理器中杀死父进程,则子进程也会被杀死。
为什么Ctrl-C和任务管理器中的查杀有区别?即使父级在任务管理器中被杀死,有什么方法可以确保子级继续运行?
createprocess ×10
c++ ×4
winapi ×4
windows ×3
delphi ×2
android ×1
batch-file ×1
c ×1
delphi-2009 ×1
exec ×1
fork ×1
handle ×1
kill ×1
linux ×1
pid ×1
process ×1
shell-exec ×1
subprocess ×1
unix ×1