- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在开头声明这是一项家庭作业,并且在编写 SIGCHLD 处理程序时我陷入了困境。我需要访问子进程中的变量。
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define TEXT_LEN 10
#define NUM_RESCUE_PLOWS 4
#define NUM_VICTIMS_TO_RESCUE 40
/* PURPOSE: To keep trap of the number of victims that have been rescued.
*/
int numRescuedVictims = 0;
/* PURPOSE: To keep track of the process id's of the rescuing snow plows.
*/
pid_t plowPid[NUM_RESCUE_PLOWS];
/* PURPOSE: To note that at least one child plow has finished. Reports the
*process id and the number of victims rescued for each child plow.
*'sigNum' tells the signal number. No return value
*/
// You may want to define a SIGCHLD listener here
// It should have a loop that wait()s for children and
// and prints how many victims each has rescued.
void listenSIGCHLD(int sig)
{
int status;
pid_t pidWait;
while((pidWait = wait(&status)) > 0)
printf("Plow %d rescued %d victim(s)", plowId, numVictimsRescued);
}
/* PURPOSE: To handle being informed of a rescued victim. 'sigNum' tells
*signal number. No return value.
*/
// You may want to define a SIGUSR1 listener here
// It increments 'numRescuedVictims' and prints the total number rescued victims
void listenSIGUSR1(int sig)
{
numRescuedVictims += &numVictimsRescued;
printf("We've rescued %d victims!" numRescuedVictims);
}
/* PURPOSE: To make 'NUM_RESCUE_PLOWS' processes to run 'rescuingPlow' to
*rescue stuck victims, and then tell them to quit after all
*'NUM_VICTIMS_TO_RESCUE' victims have been rescued. Ignores parameters.
*Returns 'EXIT_SUCCESS' to OS.
*/
int main ()
{
// I. Applicability validity check:
// II. Rescue victims:
// II.A. Install 'SIGUSR1' handler:
signal(SIGUSR1, listenSIGUSR1);
// Install 'SIGUSR1' handler
// Install your SIGCHLD handler here
signal(SIGCHLD, listenSIGCHLD);
// II.B. Tell NUM_RESCUE_PLOWS plows to start rescuing the victims:
int i;
int myPid= getpid();
for (i = 0; i < NUM_RESCUE_PLOWS; i++)
{
// Do a fork() and save it in plowPid[i]
plowPid[i] = fork();
// If plowPid[i] is less than 0 then do:
if(plowPid[i] < 0)
{
fprintf(stderr,"Dude, your system is WAY to busy to play rescuer!\n");
return(EXIT_FAILURE);
}
// If plowPid[i] is equal to 0 then do:
else if(plowPid[i] == 0)
{
char pidText[TEXT_LEN];
char indexText[TEXT_LEN];
}
snprintf(pidText,TEXT_LEN,"%d",myPid);
snprintf(indexText,TEXT_LEN,"%d",i);
execl("./rescuingPlow","rescuingPlow",pidText,indexText,NULL);
fprintf(stderr,"Dude, somebody stole my plow!!\n");
return(EXIT_FAILURE);
}
// II.C. Wait until all victims have been rescued:
while (numRescuedVictims < NUM_VICTIMS_TO_RESCUE)
{
sleep(1);
printf("Searching for victims . . .\n");
}
// III. Finished:
// Loop to send SIGTERM to all NUM_RESCUE_PLOWS plow processes
for (int i = 0; i < NUM_RESCUE_PLOWS; i++)
{
kill(plowPid[i], SIGTERM);
}
int toSleep= NUM_RESCUE_PLOWS;
// sleep() can be interrupted by SIGCHLD. Whenever it is interrupted
// it returns the number of seconds that still remain on its alarm
// clock. Let's wait until it has slept its full amount incase it
// was prematured interrupted by SIGCHLD.
do
{
toSleep= sleep(toSleep);
}
while (toSleep > 0);
printf("Ready for the NEXT snow storm!\n");
return(EXIT_SUCCESS);
}
`
这就是最终生成的进程。虽然我还没有解决这个问题。
/*
* rescuingPlow.c
*
* Compile with $ gcc rescuingPlow.c -o rescuingPlow
*/
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
/* PURPOSE: To keep track of the number of victims that this process
* rescued.
*/
int numVictimsRescued = 0;
/* PURPOSE: To return the number of victims rescued to the OS. 'sigNum'
* tells the signal number. No return value.
*/
// You may want to write a SIGTERM handling function
// that returns to the OS 'numVictimsRescued'.
/* PURPOSE: To rescue victims at random intervals and inform parent process
* by sending it SIGUSR1 until receiving SIGTERM. First parameter (after
* program name) tells parent's process id. Second parameter tells this
* plow's index.
*/
int main (int argc, char* argv[])
{
// I. Applicability validity check:
pid_t parentPID;
int plowId;
if (argc < 3)
{
fprintf(stderr,"USAGE: rescuingPlow <parentPID> <plowId>\n");
return(EXIT_FAILURE);
}
parentPID = atoi(argv[1]);
plowId = atoi(argv[2]);
// II. Rescuing victims until told to stop:
// II.A. Install signal handler:
// Install your SIGTERM handler here
srand(plowId); // Uniquely initialize random number generator so they act independently of each other
// II.B. Rescue victims:
// Write an endless loop that:
// (1) Does 'sleep((rand() % 6) + 1);'
// (2) Increments 'numVictimsRescued'
// (3) Does 'printf("Plow %d rescued %d victim(s)!\n",plowId,numVictimsRescued);'
// (4) Send 'SIGUSR1' to 'parentPID'
// III. Finished:
return(EXIT_SUCCESS);
}
我不完全确定我要处理这个问题或如何处理这个问题。我非常有信心我能够解决大多数其他存在的问题。
最佳答案
如果不使用某些 IPC 机制,子进程只能将 8 位的值传递给父进程。
这 8 位由子进程作为调用 exit()
的参数发送,并由父进程通过将宏 WEXITSTATUS()
应用于以下值来接收成功调用 wait()
或 waitpid()
返回的 status
。请参阅 man 2 exit
和 man 2 wait
了解详细信息。
如果我没记错的话,8 位是标准定义的最小值。某些实现可能允许更多位。
更新:
如何使用wait()
的示例:
int child_exit_code = -1;
int status = -1;
pid_t pid = wait(&status);
if (-1 != pid)
child_exit_code = WEXITSTATUS(status);
关于c - 需要在 SIGCHLD 处理程序期间访问子进程的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16392762/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!