Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liblongpath-rsync
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liblongpath
liblongpath-rsync
Commits
dbefb6b4
Commit
dbefb6b4
authored
Sep 26, 2005
by
Wayne Davison
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fixed wait_process() to handle cases where waitpid() fails or
the child process did not exit cleanly.
parent
60168410
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
17 additions
and
7 deletions
+17
-7
main.c
main.c
+17
-7
No files found.
main.c
View file @
dbefb6b4
...
...
@@ -81,12 +81,12 @@ static void show_malloc_stats(void);
/****************************************************************************
wait for a process to exit, calling io_flush while waiting
****************************************************************************/
void
wait_process
(
pid_t
pid
,
int
*
status
)
static
void
wait_process
(
pid_t
pid
,
int
*
code_ptr
)
{
pid_t
waited_pid
;
int
cnt
;
int
cnt
,
status
;
while
((
waited_pid
=
waitpid
(
pid
,
status
,
WNOHANG
))
==
0
)
{
while
((
waited_pid
=
waitpid
(
pid
,
&
status
,
WNOHANG
))
==
0
)
{
msleep
(
20
);
io_flush
(
FULL_FLUSH
);
}
...
...
@@ -97,7 +97,8 @@ void wait_process(pid_t pid, int *status)
*/
for
(
cnt
=
0
;
cnt
<
MAXCHILDPROCS
;
cnt
++
)
{
if
(
pid
==
pid_stat_table
[
cnt
].
pid
)
{
*
status
=
pid_stat_table
[
cnt
].
status
;
waited_pid
=
pid
;
status
=
pid_stat_table
[
cnt
].
status
;
pid_stat_table
[
cnt
].
pid
=
0
;
break
;
}
...
...
@@ -107,9 +108,18 @@ void wait_process(pid_t pid, int *status)
/* TODO: If the child exited on a signal, then log an
* appropriate error message. Perhaps we should also accept a
* message describing the purpose of the child. Also indicate
* this to the caller so that thhey know something went
* wrong. */
*
status
=
WEXITSTATUS
(
*
status
);
* this to the caller so that they know something went wrong. */
if
(
waited_pid
<
0
)
*
code_ptr
=
RERR_WAITCHILD
;
else
if
(
!
WIFEXITED
(
status
))
{
if
(
WCOREDUMP
(
status
))
*
code_ptr
=
RERR_CRASHED
;
else
if
(
WIFSIGNALED
(
status
))
*
code_ptr
=
RERR_TERMINATED
;
else
*
code_ptr
=
RERR_WAITCHILD
;
}
else
*
code_ptr
=
WEXITSTATUS
(
status
);
}
/* This function gets called from all 3 processes. We want the client side
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment