¿Es posible ejecutar un proceso cuyo argc = 0? Necesito ejecutar un programa, pero es extremadamente importante que su argc sea igual a 0. ¿Hay alguna manera de hacerlo? Intenté poner 2^32 argumentos en la línea de comando para que parezca como si argc = 0 pero hay un límite máximo para la cantidad de argumentos.ejecutando un proceso con argc = 0
Respuesta
Puede escribir un programa que llame directamente al exec; que le permite especificar los argumentos de la línea de comandos (incluido el nombre del programa) y la falta de los mismos.
Se puede escribir un programa C que genera/ejecutivos otro programa que no tenga argv, como:
#include <spawn.h>
#include <stdlib.h>
int main(int argc, char** argv, char** envp)
{
pid_t pid;
char* zero_argv[] = {NULL};
posix_spawn(&pid, "./that_app", NULL, NULL, zero_argv, envp);
int status;
waitpid(&pid, &status, NULL);
return 0;
}
¿No sería esto un comportamiento indefinido? – user
@user: en realidad no. El estándar trata 'argc' y' argv [0] == 0' como una situación perfectamente precisa. Ver [esta pregunta] (http://stackoverflow.com/questions/2794150/when-can-argv0-have-null). –
Es posible utilizar la llamada al sistema Linux execve().
int execve(const char *filename, char *const argv[], char *const envp[]);
Usted puede pasar el nombre de archivo del ejecutable y un puntero nulo como argv [] para ejecutar el binario y el argc será cero.
Es mi código de prueba:
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[]={ NULL };
execv("./target", argv);
return (0);
}
Y el strace resultado es:
execve("./target", [], [/* 20 vars */]) = 0
usted podría utilizar envp [] a pasar los argumentos que ha definido de todos modos.
Además, puede usar el lenguaje ensamblador para alcanzar su objetivo (argc == 0 pero aún necesita pasar argumentos). Supongo que está utilizando un entorno de 32 bits x86.
El concepto es que:
- tienda 0x0B ($ SYS_execve) en % eax
- poner la dirección de argv [] en % ebx
- poner el dirección de envp [] en % ecx
- a continuación, utilizar int 0x80 hacer una llamada al sistema
La estructura de la memoria se muestra a continuación:
+--------------------------------------------------+
| +----------------------------------|-----+
v v v------------------|-----|-----+
[arg_0][\0][...][arg_1][\0][...][arg_2][\0][...][ptr0][ptr1][ptr2][\0]
^
| (argv[] = NULL)
+--- envp
Me pregunto que si estuviera haciendo la asignación de laboratorio del curso proporcionado por el profesor . Taesoo Kim (GATech). Enlace del curso: https://tc.gtisc.gatech.edu/cs6265
¿O es un problema de CTF (catch-the-flag contest) de hackers?
Esto no proporciona una respuesta a la pregunta. Una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation) podrá [comentar cualquier publicación] (http://stackoverflow.com/help/privileges/comment); en su lugar, [brinde respuestas que no requieran aclaración del autor de la pregunta] (http://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do-instead). - [De la crítica] (/ review/low-quality-posts/15041212) –
Solucionado, gracias. – vegafish
- 1. ¿Cómo verificar si un proceso se está ejecutando con Delphi?
- 2. argv [argc] ==?
- 3. ¿Cómo rastrear el script PHP ejecutando un proceso determinado?
- 4. Comprobar si el proceso se está ejecutando
- 5. Verificando un proceso php ya se está ejecutando
- 6. ¿Se está ejecutando un proceso en una máquina remota?
- 7. ¿Cómo verifica en Linux con Python si todavía se está ejecutando un proceso?
- 8. ¿Cómo puedo saber si un proceso se está ejecutando?
- 9. Powershell: si un proceso no se está ejecutando, inícielo
- 10. ¿Cómo verificar si se está ejecutando un proceso con un PID determinado?
- 11. ¿Cómo puedo verificar desde Ruby si se está ejecutando un proceso con un determinado pid?
- 12. Ejecutando un proceso con los privilegios más bajos posibles en winapi
- 13. Detectar un proceso que ya se está ejecutando en Windows con C# .NET
- 14. ¿Qué significa int argc, char * argv []?
- 15. android.database.CursorIndexOutOfBoundsException: Índice 0 solicitado, con un tamaño de 0
- 16. Error - android.database.CursorIndexOutOfBoundsException: Índice 0 solicitada, con un tamaño de 0
- 17. CursorIndexOutOfBoundsException Índice 0 solicitado, con un tamaño de 0
- 18. C++ - int main (int argc, char ** argv)
- 19. Process.HasExited devuelve verdadero aunque el proceso se está ejecutando?
- 20. 0 + 0 + 0 ... + 0! = 0
- 21. ¿Cómo usa el iOS argc y argv?
- 22. Usando argc y argv en Eclipse?
- 23. Ejecutando JSCoverage con Jasmine
- 24. Ejecutando if @@ rowcount> 0 resetea @@ rowcount a 0. ¿Por qué?
- 25. Comprobando si el proceso aún se está ejecutando?
- 26. Procesar argc y argv fuera de main()
- 27. "El depurador no puede continuar ejecutando el proceso".
- 28. Ejecutando cadena variable como comando en el proceso por lotes
- 29. selenio retornos de casos de prueba de proceso terminó con código de salida PHPUnit 0
- 30. Inicie un proceso en segundo plano en Linux con C
¿Qué estás tratando de lograr exactamente?Quiero decir, tal vez hay otra manera más simple de hacerlo. – Aziz
¿Cuál es su sistema operativo y cómo está ejecutando este proceso? ¿Está activado por el usuario o estás llamando desde otro proceso? – ibid
¿No puedes simplemente establecer 'argc = 0' como la primera línea de' main() '? –