Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
exec()函数在管道命名程序中的实现_C_Linux_Pipe_Exec - Fatal编程技术网

exec()函数在管道命名程序中的实现

exec()函数在管道命名程序中的实现,c,linux,pipe,exec,C,Linux,Pipe,Exec,exec()函数有问题。 我的程序应该通过终端调用,输入“/a.out-from-to-message”和打印“from:to:message”作为执行。 我不知道如何实现exec()函数,以允许我键入“/a.out from to message”并打印结果。 在程序中,我必须使用命名管道来读写“消息”。 如何解决 我的一段代码: int main(int argc, char* argv[]) { int i = 0; char* fr0m[MAX], t0[MAX], message

exec()函数有问题。 我的程序应该通过终端调用,输入“/a.out-from-to-message”和打印“from:to:message”作为执行。 我不知道如何实现exec()函数,以允许我键入“/a.out from to message”并打印结果。 在程序中,我必须使用命名管道来读写“消息”。 如何解决

我的一段代码:

int main(int argc, char* argv[]) {

 int i = 0;
 char* fr0m[MAX], t0[MAX], message[MAX];

 execve("./a.out", "./a.out", "from.txt", fr0m, "t0.txt", t0, "message.txt", message, NULL);
 puts(strerror(errno));

 int File1 = mkfifo("opened.txt", 0666);
 int File2 = mkfifo("saved.txt", 0666);

 int Opened = open("opened.txt", O_CREAT | O_WRONLY | O_TRUNC, 0777);
 int Saved = open("saved.txt", O_CREAT | O_RDONLY | O_TRUNC, 0777);

 int File1Process = fork();

 int Scanner; 

 if( File1Process == 0 ) {

    char c;
    read( Opened, message, sizeof(message) );
    while( ( Scanner = read( Opened, &c, sizeof(message) ) ) > 0 )
            printf( "%i", message[i] );

    close( Opened );    
 }

 if( File1Process != 0 ) {
    write( Saved, message, sizeof(message) );
    close( Saved );

    printf("<");
    for(i=0; i<sizeof(fr0m); i++) printf( "%c", fr0m[i]);
    printf("> : "); 
}

[...]
intmain(intargc,char*argv[]){
int i=0;
字符*fr0m[MAX],t0[MAX],消息[MAX];
execve(“./a.out”、“/a.out”、“from.txt”、fr0m、“t0.txt”、t0、“message.txt”、message,NULL);
put(strerror(errno));
int File1=mkfifo(“opened.txt”,0666);
int File2=mkfifo(“saved.txt”,0666);
int Opened=open(“Opened.txt”,O|u CREAT | O|u WRONLY | O|u TRUNC,0777);
int Saved=open(“Saved.txt”,O|CREAT | O|RDONLY | O|TRUNC,0777);
int File1Process=fork();
int扫描仪;
if(File1Process==0){
字符c;
读取(已打开、消息、大小(消息));
而((Scanner=read(Opened,&c,sizeof(message)))>0)
printf(“%i”,消息[i]);
关闭(打开);
}
如果(File1Process!=0){
写入(已保存、消息、大小(消息));
关闭(保存);
printf(“:”);
}
[...]

这里有多个问题。在我看来,任务是编写一个程序,在执行时接受三个参数,然后用空格-冒号-空格顺序将输出中的参数和结尾的换行符回显到屏幕上。该程序将从终端窗口运行:

$ ./a.out source target 'what was said'
source : target : what was said
$
虽然您可以编写第二个程序来执行其输出如图所示的程序,但没有明确的需求

在代码中,您有:

int main(int argc, char* argv[]) {

 int i = 0;
 char* fr0m[MAX], t0[MAX], message[MAX];

 execve("./a.out", "./a.out", "from.txt", fr0m, "t0.txt", t0, "message.txt", message, NULL);
 puts(strerror(errno));
这个片段中有很多问题:

  • 如果
    execve()
    返回,则表示失败
  • 您正在调用
    execve()
    ,就好像它是
    execle()
  • 您正在将未初始化的指针传递给
    execve()
  • 您有
    char*
    数组,而不是
    char
    数组
  • 错误消息最好在标准错误上报告,而不是在标准输出上报告
如果
execve()
失败,程序继续创建一对FIFO,然后尝试打开它们。很可能没有其他进程打开FIFO,因此第一个打开的进程将无限期地阻塞。无论它做什么,其余代码似乎与问题中所述的任务的任何合理解释完全无关

您的代码应该非常简单

#include <stdio.h>

int main(int argc, char **argv)
{
    if (argc == 4)
        printf("%s : %s : %s\n", argv[1], argv[2], argv[3]);
    else
        fprintf(stderr, "Usage: %s from to 'message'\n", argv[0]);
    return 0;
}
#包括
int main(int argc,字符**argv)
{
如果(argc==4)
printf(“%s:%s:%s\n”,argv[1],argv[2],argv[3]);
其他的
fprintf(stderr,“用法:%s from to'message'\n”,argv[0]);
返回0;
}
这方面的主要缺陷是,它在打印使用错误消息时报告“success”,这很容易修复

如果您想要一个程序来执行该程序,那么:

#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    char *envp[] =
    {
        "HOME=/home/user",
        "PATH=/bin:/usr/bin",
        "TZ=UTC0"
        0
    };
    if (argc != 4)
    {
        fprintf(stderr, "Usage: %s from to 'message'\n", argv[0]);
        return 1;
    }
    argv[0] = "./a.out";
    printf("About to execute %s\n", argv[0]);
    execve(argv[0], argv, envp);
    fprintf(stderr, "Failed to execute %s\n", argv[0]);
    return 1;
}
#包括
#包括
int main(int argc,字符**argv)
{
char*envp[]=
{
“HOME=/HOME/user”,
“路径=/bin:/usr/bin”,
“TZ=UTC0”
0
};
如果(argc!=4)
{
fprintf(stderr,“用法:%s from to'message'\n”,argv[0]);
返回1;
}
argv[0]=“/a.out”;
printf(“即将执行%s\n”,argv[0]);
execve(argv[0],argv,envp);
fprintf(stderr,“未能执行%s\n”,argv[0]);
返回1;
}
不要将此代码编译为
a.out
;最终会有一个程序自动执行。在
execve()
之前的
printf()
让您知道正在发生这种情况;您必须中断它以停止它