【问题标题】:Share number of child process to parent process. Exit() & Wait() or global variable将子进程的数量共享给父进程。 Exit() 和 Wait() 或全局变量
【发布时间】:2018-11-21 14:21:42
【问题描述】:

我有父进程需要输出子进程退出码的任务。这个退出代码应该是子进程 id 的总和,加上一个变量 k 和整个模 100。我尝试了两种方法来保存子进程的退出代码:

  • 在子进程中退出(退出代码)并使用 wait() 保存在父进程中。你应该在 cmets 中仍然使用这个
  • 在全局变量中保存退出代码并在父进程中等待()后输出退出代码

但是,两者都不起作用。你能帮助我如何实现它吗?谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

//globale Variable
int out;

int main()
{
//Nutzereingabe von k:
int k=0;
scanf("%d",&k);
    //Erzeugen eines Kindprozesses:
    if(fork()==0)
    {
        //Kindprozess liegt vor
    int zaehler=1;
    char ausgabe[256]={0};
    while(zaehler<=k){
        //printf("%d\t"
        int pid=getpid();
        int ppid=getppid();
        sprintf(ausgabe, "%d %c %d %c %d\n", pid,' ', ppid,' ',zaehler);
        write(STDOUT_FILENO, ausgabe, strlen(ausgabe));
        sleep(1);
    zaehler++;
    }   
    //write(STDOUT_FILENO, (getpid()+k)%100, strlen((getpid()+k)/100));
    //printf("%d\n", (getpid()+k)%100);
    out=(getpid()+k)%100;
    printf("%i", out);
    exit((getpid()+k)%100);
 }
    else
    {
        //Elternprozess liegt vor
        time_t curtime;
        time(&curtime);
        printf("Start: %s", ctime(&curtime));

    }
    //int exitcode=wait(NULL);
    wait(NULL);
    //exitcode to String casten:
    char str[24];
    sprintf(str, "Exit-Code: %i\n", out);
    //Ausgabe und exitcode zu einem String zusammenfuegen: (vorher concat())
    //char* s = concat("Exit-Code: ", str);
    //strncat(*str,"Exit-Code: ",str);
    //Ausgabe des Exitcodes:
    write(STDOUT_FILENO, str, strlen(str));
    time_t curtime;
    time(&curtime);
    printf("Ende: %s\n", ctime(&curtime));
    return 0;
}

【问题讨论】:

    标签: c linux


    【解决方案1】:

    来自man wait

    pid_t 等待(int *status);

    如果 status 不为 NULL,wait() 和 waitpid() 将状态信息存储在它指向的 int 中。

    WEXITSTATUS(状态) 返回孩子的退出状态。这由状态参数的最低有效 8 位组成,子进程在调用 exit(3) 或 _exit(2) ....时指定。

    所以使用:

    }
    // warte fur unserer kind
    int exitstatus;
    wait(&exitstatus);
    // caste exitcode to string casten
    char str[24];
    sprintf(str, "Exit-Code: %d\n", WEXITSTATUS(exitstatus));
    

    【讨论】:

    • 感谢您的帮助!也许您也可以简短地解释一下为什么我使用全局变量的方法不起作用?谢谢!
    • 进程之间没有全局变量。每个进程都是独立的——它们之间没有任何联系,除了waitpidfork 返回值。每个进程都有一个单独的out 变量。有两个过程,它们不会以任何方式“互连”。您可以创建一个“共享内存”(池),您将在其中放置变量(名称“共享”意味着它是进程之间共享的内存)或使用创建线程的线程(pthreads) - 一个进程,多个执行。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-06-22
    • 2015-11-23
    • 1970-01-01
    • 2014-12-31
    • 2013-01-07
    • 1970-01-01
    相关资源
    最近更新 更多