簡體   English   中英

管道命名程序中exec()函數的實現

[英]implementation of exec() function in pipe named program

我對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("> : "); 
}

[...]

這里有多個問題。 在我看來,任務是編寫一個程序,該程序在執行時會接受三個參數,然后使用空格,空格,空格序列將它們回顯到屏幕上,以分隔輸出中的參數和換行符。結束。 該程序將從終端窗口運行:

$ ./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;
}

這樣做的主要缺陷是在打印使用錯誤消息時報告“成功”,該錯誤消息很容易修復。

如果要某個程序執行該程序,則:

#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;
}

不要將此代碼編譯為a.out 您將最終獲得永久執行的程序。 execve() printf()之前的printf()讓您知道正在發生的事情; 您必須中斷它才能停止它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM