- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在列表中写入一些结构信息。该结构体是Pstatus,它是全局定义的pGlobal。现在我想在函数 getStatus() 中使用 pGlobal 读取此列表,但这不起作用。所以我创建了另一个定义 pGlobal2 但这会带来很多问题。我想读出我的 list ,但我得到了一些虚假信息。在此列表中,存储了正在运行的进程的 pid,但是当我读出它时,我只得到最后的 pid 和信息,但我得到的信息与存储的 pid 一样多。如果此列表中存储了 5 个 pid,则我会获取最后一个 5 次。我想那是因为我有 pGlobal 和 pGlobal2。有人可以帮助我吗?
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <errno.h>
#include "utils.h"
#include "listen.h"
#include "wortspeicher.h"
#include "kommandos.h"
#include "frontend.h"
#include "parser.h"
#include "variablen.h"
int interpretiere(Kommando k, int forkexec);
int interpretiere_einfach(Kommando k, int forkexec);
int getStatus();
Pstatus pGlobal;
Pstatus *pGlobal2;
Liste procTable;
int aufruf(Kommando k, int forkexec){
int kind_status, i;
/* Programmaufruf im aktuellen Prozess (forkexec==0)
oder Subprozess (forkexec==1)
*/
if(forkexec){
int pid=fork();
switch (pid){
case -1:
perror("Fehler bei fork");
return(-1);
case 0:
if(umlenkungen(k))
exit(1);
do_execvp(k->u.einfach.wortanzahl, k->u.einfach.worte);
abbruch("interner Fehler 001"); /* sollte nie ausgeführt werden */
default:
if(k->endeabwarten) {
/* So einfach geht das hier nicht! */
/* schreibt die PID, den Namen und den Status in die Tabelle */
pGlobal = erzeugeProzess (pid, k->u.einfach.worte[0], "RUNNING"); /*k->u.einfach.worte[0] */
/* Debug: print
printf("\npid: %d\tstatus: %s\n", p.pid, p.status);
*/
i = listeLaenge(procTable);
procTable = listeAnfuegen(procTable, &pGlobal);
if(listeLaenge(procTable) <= i) {
fprintf(stderr, "Fehler beim Schreiben in die Liste!");
}
/* Debug printf: Bis hierhin wird alles ordentlich in die Liste geschrieben! */
/*test = listeKopf(procTable);
printf("pointer1: %p",test);
printf("\npid: %d\tstatus: %s\n", test->pid, test->status); */
waitpid(pid, &kind_status, 0);
if(WIFEXITED(kind_status)){
printf("Kind mit der PID %d wurde beendet\n",pid);
if (WEXITSTATUS(kind_status) == 0) {
/** setze status exit(0) */
printf("Kind erfolgreich\n");
pGlobal = statusAendern(pGlobal,pid,"exit(0)");
}
/* nicht erfolgreiche ausgeführt */
else
{
/** setze status exit(1) */
printf("Kind nicht erfolgreich\n");
pGlobal = statusAendern(pGlobal,pid,"exit(1)");
}
}
else if(WIFSIGNALED(kind_status)){
printf("Kind mit der PID %d wurde durch Signal abgebrochen. Signalnummer: %d\n",pid, WTERMSIG(kind_status));
pGlobal = statusAendern(pGlobal,pid,"signal");
}
}
else {
fprintf(stderr, "Programm nicht beendet\n");
fprintf(stdout, "PID: %i\n", pid);
}
return 0;
}
}
/* nur exec, kein fork */
if(umlenkungen(k))
exit(1);
do_execvp(k->u.einfach.wortanzahl, k->u.einfach.worte);
abbruch("interner Fehler 001"); /* sollte nie ausgeführt werden */
exit(1);
}
int interpretiere_einfach(Kommando k, int forkexec){
char **worte = k->u.einfach.worte;
int anzahl=k->u.einfach.wortanzahl;
/* gibt den Status der Subprozesse zurück */
if (strcmp(worte[0], "status")==0){
/* NYI */
getStatus();
}
return aufruf(k, forkexec);
}
int getStatus() {
Liste temp, temp2;
fprintf(stdout, "---------------------\n----Statustabelle----\n---------------------\n");
temp = procTable;
printf("laenge der liste: %d\n",listeLaenge(temp));
/*fprintf(stdout, "Pid: %d", p->pid);*/
if(listeLaenge(temp) < 1) {
fprintf(stdout, "Liste ist leer.\n");
return 0;
}
while(temp != NULL){
pGlobal2 = listeKopf(temp);
/*printf("check: %d\n",pGlobal2->check);*/
if(pGlobal2->check < 1) {
fprintf(stdout,"PID: %d, Programm: %s, Status: %s\n",pGlobal2->pid, pGlobal2->name, pGlobal2->status);
}
if(strcmp(pGlobal2->status, "RUNNING") != 0) {
pGlobal2->check = 1;
}
/*if(strcmp(pGlobal2->status, "RUNNING") == 0) {
printf("eintrag behalten");
listeAnfuegen(temp2, pGlobal2);
}*/
/* wenn status != running -> p.checked() */
temp = listeRest(temp);
}
return 0;
}
}
我已经得到了结构
typedef struct {
int pid; /* Prozess ID */
char* name; /* Prozess Name (Programm) */
char* status; /* Status des Programms */
int check; /* bereits abgerufen? 1 - abgerufen, 0 - nicht abgerufen */
} Pstatus;
听:
typedef struct liste {
void *kopf;
struct liste *rest;
} *Liste;
列表科普夫:
void* listeKopf(Liste l) {
if(l==NULL)
abbruch("listeKopf(listeLeer) undefiniert");
return l->kopf;
}
listeAnfuegen:
Liste listeAnfuegen(Liste l, void* element){
Liste neu=reserviere(sizeof (struct liste));
neu->kopf = element;
neu->rest = l;
return neu;
}
最佳答案
您提供了大量信息,但没有提供关键内容。因此,我假设 erzeugeProzess
返回一个结构 Pstatus
。您可以像这样将节点添加到列表中:
pGlobal = erzeugeProzess(pid, k->u.einfach.worte[0], "RUNNING");
procTable = listeAnfuegen(procTable, &pGlobal);
因此,您始终将 pGlobal
的地址添加到您的列表中,当然,该列表始终包含上次调用 erzeugeProzess
时分配的内容。 (这也是您的代码无法使用局部变量的原因:列表中的引用是堆栈上的某个位置,该位置很可能不包含有用的信息。)
解决方案是让erzeugeProzess
真正在堆栈上创建一个对象,例如:
Pstatus *proc_new(...)
{
Pstatus *proc = malloc(sizeof(*proc));
// initialise
return proc;
}
这将创建一个新进程,并在堆上拥有自己的数据,您可以将其分配给列表。不过,您需要在某个时候释放
进程。
完成此操作后,您将不再需要全局变量。使用局部变量。您不会丢失引用,因为您将其存储在列表中:
Pstatus *p = proc_new(pid, k->u.einfach.worte[0], "RUNNING");
procTable = listeAnfuegen(procTable, p);
附带说明:您的代码有一些非常尴尬的命名约定。例如,erzeugeProzess
表示createProces
,但在您的版本中,它不会创建任何内容。 (通常假设 create
或其名称包含 new
的函数在堆上创建内容。)
同样,您所说的列表的 kopf
或 head
并不是它的头部。它是与列表中一个节点关联的数据。头部将是它的第一个元素。
关于c - 从c中的列表中读取函数中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24202205/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!