我想传递一个指针(我将一个带有mmap的数据存储在内存中的文件)到使用fork + exec生成的进程,但我仍然坚持如何将指针传递给exec()生成的进程?
UPDATE1:
感谢您的输入,我使用共享内存创建它与mmap与MAP_INHERIT标志:
使用mmap()函数创建的每个映射文件和共享内存区域都是通过成功调用任何exec函数而取消映射的,除了那些使用MAP_INHERIT选项映射的区域.使用MAP_INHERIT选项映射的区域仍保留在新过程映像中.
来源:http://www.uwm.edu/cgi-bin/IMT/wwwman?topic=exec(2)&msection=
UPDATE2:
这是家庭作业练习,但我想我必须停止思考指针并思考IPC本身.我想我会尝试在子进程中映射相同的文件.
短代码示例非常感谢.
在此先感谢您的帮助.
我正在编写自己的unix终端,我遇到了执行命令的问题:
首先,我将用户输入并将其存储到缓冲区中,然后将单词分开并将它们存储到我的argv []数组中.即命令是"firefox"来启动存储在argv [0]中的firefox
如何启动命令?这就是我想要做的,但我遇到了错误:
void launchProcess(char *command[], char *file){
pid_t pid;
pid = fork();
if (pid == -1) {
perror("Error when forking");
exit(EXIT_FAILURE);
}
if (pid == 0){
fprintf(stderr, "Child pid = %d\n", getpid());
execv(file, command);
}
Run Code Online (Sandbox Code Playgroud)
我打电话的时候:
launchProcess(commandArgv, "STANDARD");
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:错误:launchProcess的冲突类型
我试图从C程序显示,设置和修改PATH环境变量.我这样做: -
char *cmd[] = { "echo", "$PATH", (char *)0 };
if (execlp("echo", *cmd) == -1)
Run Code Online (Sandbox Code Playgroud)
但我没有得到结果.
我想通过execve在C程序中调用一个shell:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
main()
{
char* path = "/bin/sh";
int err = execve(path, &path, NULL);
printf("%d\n", err);
printf("%s\n", strerror(errno));
printf("%x, %x\n", path, &path);
}
Run Code Online (Sandbox Code Playgroud)
但输出是:
-1
Bad address
80485c0, bf816f4c
Run Code Online (Sandbox Code Playgroud) 我正在使用Fedora linux,其中ulimit -n 10000将文件限制增加到10000.我想使用java程序实现相同的目标
如何使用ulimit编写java程序来增加文件限制我已经尝试过以下程序,但它没有运行良好.该程序没有给出任何错误.但也没有增加文件限制
public class IncreaseFIle {
public static void main(String[] args) {
String command = "/bin/bash ulimit -n 10000";
// String command = "pwd";
try {
Runtime.getRuntime().exec(command);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢Sunil Kumar Sahoo
我想基于子代码的执行,将一个唯一的状态代码从子进程通过exit()返回给等待的父进程.如果execvp失败,则使用exit().我假设如果execvp成功,执行的命令将发送其状态代码.
pid=fork();
if(pid==0)
{
if(execvp(cmdName,cmdArgs)==-1)
{
printf("Exec failed!\n");
exit(K); //K?
}
}
waitpid(pid,&status,0);
Run Code Online (Sandbox Code Playgroud)
假设传递给execvp()的命令是"ls",手册页说它可能返回0(成功),1或2(失败).
我可以使用什么安全唯一值K来指示子进程的返回状态,它不会与execvp()执行的命令返回的任何值冲突?
只是一个简单的问题,如果我克隆一个进程,克隆进程的PID是一样的,是吗?fork()创建一个PID不同的子进程,但其他一切都是相同的.Vfork()使用相同的PID创建子进程.Exec用于将当前正在执行的进程更改为其他进程.
我在所有这些陈述中都是正确的吗?
我已经尝试过搜索,但是如果在某个地方得到回答的话,我没有多少运气道歉.
我正在玩一些零碎的东西,我试图将一个URL变量传递给EXEC.这是我正在尝试的... sc.exe是一个我必须传递URL的程序 - $ GET_ID变量必须来自URL
$GET_ID =$_GET= ['myid'];
exec('sc.exe --url=http://localhost/DS1/test.php?ID='.$GET_ID.'&TEST=1');
echo $GET_ID;
Run Code Online (Sandbox Code Playgroud)
当我尝试这个代码时 - 似乎没有传递GET变量,程序得到 http://localhost/DS1/test.php?ID =&TEST = 1 '
我做了一些搜索..这似乎是一种限制..所以解决方案/解决方法是什么?
谢谢
我一直试图在PHP中使用ghostscript将pdf文件转换为图像(png,jpg).
只要它们是图像我就不在乎.这是我使用的代码.
exec("gs -sDEVICE=jpeg -sOutputFile=/Applications/Mamp/htdocs/cover.jpg -r144 /Applications/Mamp/htdocs/test.pdf");
Run Code Online (Sandbox Code Playgroud)
当我输入完全相同的东西,显然没有exec和引号,进入命令行它完全符合我的要求.但是,当我运行php文件时没有任何反应.我正在使用MAMP服务器,服务器似乎工作正常,每当我用它运行另一个文件我没有问题.任何人都有任何想法为什么它可能无法正确执行?
我正在玩exec家庭功能,我看到了一个非常奇怪的行为:它们在chroot()系统调用后似乎不起作用.
这是来自联机帮助页的相关报价:
execlp()和execvp()的特殊语义
如果指定的文件名不包含斜杠(/)字符,则execlp(),execvp()和execvpe()函数会复制shell在搜索可执行文件时的操作.在PATH环境变量中指定的以冒号分隔的目录路径名列表中查找该文件.如果未定义此变量,则路径列表默认为当前目录,后跟confstr(_CS_PATH)返回的目录列表.(此confstr(3)调用通常返回值"/ bin:/ usr/bin".)
如果指定的文件名包含斜杠字符,则忽略PATH,并执行指定路径名的文件.
这就是理论,现在让我们看看它的表现如何:
我有prog.c将执行的文件execlp:
#include <stdio.h>
int main()
{
puts("works!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)我有exec.c文件将尝试执行prog:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
int main(int argc, char* const argv[])
{
const char path[] = "/home/zaffy/cool";
if (argc < 2)
return 1;
if (argc > 2 && (chdir(path) || chroot(path)))
{
printf("Cannot chroot(%s): %s\n", path, strerror(errno));
return 1;
} …Run Code Online (Sandbox Code Playgroud)