与子进程共享子进程号。 Exit()和Wait()或全局变量

时间:2018-11-21 14:21:42

标签: c linux

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

  • 在子进程中退出(退出代码),并使用wait()保存在父进程中。您仍然应该在评论中保留这个
  • 将退出代码保存在全局变量中,并在父进程的wait()之后输出退出代码

但是,两者都不起作用。您能帮我实现目标吗?谢谢!

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

1 个答案:

答案 0 :(得分:1)

来自man wait

  

pid_t wait(int * status);

     

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

     

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

因此使用:

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